Re[30]: плохой язык C++ :)
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 10.03.06 21:46
Оценка:
Здравствуйте, igna, Вы писали:

I>А контейнер ассоциативный.


Поинтересуйся, почему для хранения на диске используют не хеш-таблицы, а В+ деревья.
... << RSDN@Home 1.2.0 alpha rev. 646 on Windows XP 5.1.2600.131072>>
AVK Blog
Re[21]: плохой язык C++ :)
От: vdimas Россия  
Дата: 10.03.06 21:55
Оценка: 42 (3)
Здравствуйте, VladD2, Вы писали:

VD>А что же с C# то? Давай как с Nemerle-ом сравним.


Да вот фиг. Я пока могу сравнивать с тем, на чем рискну делать реальные проекты.

VD>Хотя и тут в общем то видно, что из С++ пытаются выжать то на что он явно не рассчитан. Что за "var(x)" иди "_1"? Что это за не определенная грязь?


_1, _2 и т.д. — это плейсхолдеры, их семантика примерно такова (по аналогии с C#):

delegate(Type1 _1, Type2 _2, Type3 _3) { ... }


VD>Ты лучше вспомни, о том, что boost::lambda вынуждает:

VD>1. Тащить за собой огромную библиотеку.

За собой как раз тащить не надо (т.е. за готовым продуктом ), а во время разработки я и на C# кучу либ использую и меня не напрягает это, скорее наоборот, радует, что кто-то за меня сделал приличную часть работы

VD>2. Резко замедляет компиляцию.


если включить интересующее в stdafx.h, то не так уж и резко.

VD>3. Применима только в примитивнихшых случаях.


именно! и это важное замечание... если на какой-то алгоритм потрачено прилично времени и сил, то не стоит, ИМХО, хоронить его в локальном замыкании, добавь пару строчек оформления для public или там protected-использования.

Т.е. на мой взгляд, все эти "местные" мелкие ф-ии как раз нужны или для примитивных алгоритмых местного масштаба, или для "адаптации" уже имеющихся алгоритмов к местным данным/условиям (curring), вот как раз и с первым и со вторым лямбда прекрасно справляется (связка lambda + bind).

И еще насчет примитивности. Лямбды изначально расчитаны на функциональный стиль и польностью покрывают ВСЕ перегружаемые операторы С++. Хотя, в принципе, можно писать выражения через запятую, это означает их последовательное исполнение. Так же существуют switch, while, if, и loop. Не так уж и примитивно.

VD>4. Неполноценная реализация.


Ты имеешь ввиду — не встроена в язык?
Разумется, сама эта либа потому и существует, что это не встроено в язык. Хотя, мне до сих пор не понятно, почему этого не было сделано. Вон даже в Паскале это есть.

Мне вполне понятно, почему этого не было в С (ведь замыкание требует передачу "окружения", т.е. дополнительные расходы и лишний уровень коссвенной адресации), но в С++, с его оптимизациями и инлайнингом во многих случаях эти расходы банально нивелировались бы...


VD>Что же ты, например, не смог воспроизвести даже примитивного кода? Почему у тебя в последней функции:


ф-ии высшего порядка создаются через bind, вот аналог твоего варианта:
    Predicate GreaterOrEquals = bind(Greater, _1) || bind(Equals, _1);


Забиндить можно было что угодно. Хоть ф-ию, хоть константу. Мы биндим (связываем) с аргументом ф-ии некое значение, либо ф-ию.

VD>В общем, очередная демонстрация так называемой аргументации. Какая на фиг краткость в плюсах? Акстись! Погляди на реальный код на С++. Это же ужасно!

VD>Тут рядом
Автор: VladD2
Дата: 06.03.06
орел даже не поверил, что понравившеся ему извращение на плюсах можно во много раз более кратко записать на шарпе.


Ну ладно... по этой теме мы когда-то ломали копья более обстоятельно и со знанием дела Помниться, я даже вывел идею TransformIterator, на основе которых делал все остальные эмуляции yield. Хотя, действительно очень удобно. Особенно, когда надо перебрать несколько разнородных коллекций. Например, часть закешированных объектов, а остальные достать из базы (если очередь в переборе дойдет).

Извраты типа лямбды наверняка кто-то придумает в С++, чтобы закрыть наиболее частовстречающиеся сценарии с yield.

V>>Замыкание красиво и элегантно создается конструкцией var(x)


VD>Красота не описуемая.

VD>Да и что же ты этой красотой так же Greater и Equals не замкнул?

Потому как я их забиндил, уже показал выше как.

И кстати, у меня там небольшой "синтаксический оверхед". Когда в выражении участвует placeholder, то писать var(x) вовсе не обязательно! Для плейсхолдеров операторы уже перегружены таким образом, что нужное приведение выполняется само, вот исправленные варианты:
    Predicate Greater = x > _1; 
    Predicate Equals = x == _1;


Если бы у нас замыкания были без параметров, то мне потребовалось бы хотя бы раз написать var(x) в выражении, чтобы дать возможность компилятору "поймать" нужную перезагрузку операторов для функциональных объектов библиотеки lambda, остальные замыкания выполнялись бы уже "сами" в процессе приведения типов.


V>> (есть еще константная версия, для избежания копирования по значению больших объектов, если мы не собираемся их модифицировать). Созданное замыкание — суть функциональный объект, который затем используется в функциях высшего порядка. Примеры эти тривиальны, иначе можно было бы показать такое же элегантное порождение curring-функций через bind.


VD> Я плякаль. Тут уже до тебя приводили примеры этой "элегантности". Поверь от нее тошнит.


Без ума креститься — только нагрешить. Локальные замыкания — это способ повышения выразительности и читабельности и ничего более. Если в результате у кого выразительность и читабельность понижается — то в пень такие лямбды, с глаз долой и не позоримся. У С++ есть нормальная возможность создать функциональный объект. Да, пусть мы потрам ровно 3 лишние строчки "синтаксического оверхеда" на вот это, например:
struct MyLambda {
    VeryComplexClass& param;
    MyLambda(VeryComplexClass& p) : param(p) {}
    ...
}


Зато напишем вместо "..." вполне читабельный некий код:
    bool operator()(T1 p1, T2 p2, T3 p3) { 
    /* тут нетривиальный и длинный код, работающий с очень сложным классом */ 
    }


Т.е. категорически не приветствую, когда из кода месят неперевариваемую лапшу... И это независимо от языка, разумеется. Я и на C# перлов нечитаемых уже видел достаточно и даже в форумах приводил. Дело, как всегда, скорее в людях, догмах/модах и ожидающих своей очереди несъеденных собаках.

V>>Но это все синтаксис. С точки зрения run-time, в C# динамически создаются экземпляры объектов/замыканий, так что подобный код я бы не рекомендовал


VD>Твои рекомендации к щастью ничего не стоят.


То-то вы там полные счастья, в своем Early парсере символы и состояния по номерам расписывали... Каменный век, однака...
Это все от того, что ты-то в отличие от многих из твоей аудитории, прекрасно разбираешься в границах этого "счастья", которое отнюдь не безгранично.

(кстати, у меня есть кое-какие работающие наметки для декларативного строго-типизированного описания лексеров и парсеров, захотелось мне взять ваш "волшебный" парсер, сижу вот кумекаю, чтобы он AST строил и моими символами-объектами оперировал, а не номерами. Вот пример описания грамматики лексического анализатора:
      static SelectRule DecDigit = "0123456789";

      [Token(typeof(int))]
      static Rule DecNumber = DecDigit + ~(DecDigit);

      [Token(typeof(double))]
      static Rule FloatNumber = ~DecDigit + '.' + DecNumber | DecNumber + '.' + ~DecDigit;


пока не придумал ничего лучше, как взять символ '~' в качестве оператора "{ expr }", т.е. повтор expr от 0 и более раз, еще вот думаю, чтобы такое задействовать в качестве оператора "[ expr ]", т.е. повтор expr 0 или 1 раз.

Символ '!' уже задействован, и означает примерно свой похожий смысл — любой терминал, кроме заданного/заданных.
)

VD>Ты хоть знаешь сколько стоит создать один мелкий объект?


Прекрасно знаю. Особенно хорошо знаю, что значит создавать их постоянно тоннами в цикле некоего частоиспользуемого алгоритма. Я даже знаю, сколько стоит СОЗДАНИЕ одного делегата (не путать со стоимостью его вызова). Потому и предостерегаю от подобных ситуаций. Разумеется, на одиночных вызовах никого не интересуют рекомендации, применимые к циклам.

VD>Что касается невозможности оптимизаций, то это не правда. Подобные вещи потенциально полностью устраняются совершенно универсальными алгоритмами.


На данном этапе развития дотнета — никак. Посмотри код MSIL, который генерится в случае этих замыканий. Там создаются вполне независимые классы, и с какой это стати JIT будет нивелировать динамическое создание объекта и делегата на метод? До такого он пока не докатился. Хотя вполне признаю, что может быть к 4-й или 5-й версии докатится. Но это будет еще очень не скоро.

V>>Напротив, в С++ не создаеются динамические объекты, не используется ни полиморфизм или коссвенная адресация, а значит все инлайнится в момент компиляции таким образом,


VD>Хм. Нэемерле тоже не пользуется для таких случаев полиморфизмом. А инлайнится или нет — это уже качество оптимизатора кокретного компилятора. К языку это отношение не имеет.


Стоп, тут ты не прав. Пока в дотнете мы жестко привязаны к делегатам, как к функциональным объектам, ты не можешь это ограничение "перешагнуть". Я уже демонстрировал технику, по которой использовал общий интерфейс, типа такого:
public interface IFunction<RetT> {
    RetT Invoke();
}

public interface IFunction<RetT, ArgT> {
    RetT Invoke(ArgT arg);
}

// и т.д.


Так вот, у нас есть возможность не только наследовать свои классы и структуры от этого интерфейса, но так же я сгенерировал делегаты до 16-ти параметров. И в чем самый непонятный мне прикол, так это в том, что я не могу такой делегат описать на C#, зато могу спокойно создать его через Emit. Да, именно, вот такой делегат:
public sealed class Function<RetT> : MulticastDelegate, IFunction<RetT> {
    public RetT Invoke();
}


И все это означает, что я теперь смогу создавать generic-методы и типы, в которые могу подавать как делегаты, так и функциональные объекты (!!!), кои могут быть структурами в т.ч., а значит полностью инлайниться JIT-ом.

Как говорится WOW!

Только тем более не понятны 2 вещи:
— почему этого нельзя добиться штатными ср-вами, а только через злостный Emit?
— почему я пишу Invoke, вместо op_invoke???


VD>Зато С++-ный код точно не полноценный. Такое замыкание ни передать никуда нельзя, ни продлить время жизни за пределы функции.


Как раз лямбду в С++ используют в основном не так, а вот так:
for_each(vec.begin(), vec.end(), _1+=10);


Т.е. передают как аргумент циклов... Или других лямбд...
Передавать можно что угодно и куда угодно. Посмотри в моем примере класс typedef Predicate. Фокус в том, что наши лямбды — они совсем не такого типа. Там происходит хитрое приведение результата к моему типу. И вот этот результат ты можешь подать хоть куда угодно. Хотя, так никто не делает, это же не C#, у нас нет никаких ограничений. Функциональный объект обычно является аргументом шаблона и принимает любой параметр, т.е. смысла в таком приведении нет.


VD>В общем, оправдания убогости стремлением к скорости явно не прокатывает. Скорости ведь хватает.


Можно без комментариев? Я вот занят экспериментами с вещами, для которых мне скорости моих 3.2GHz начинает нехватать. И я уже перешел с C# обратно на С++. (Начинал макетировать на C#).

VD>Куда больше можно "выжать" используя более подходящие алгоритмы.


Бывают такие области применений, где данных много, а алгоритмы несложные и уже "выжаты" до предела. Только данных от этого меньше не становится...

VD>А вот выразительности и простоты явно не хватает. Их никогда хватать не будет.


Это да, это есть. И всегда будет, я надеюсь... Как говориться — нет предела совершенству.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[29]: плохой язык C++ :)
От: vdimas Россия  
Дата: 10.03.06 23:25
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Не потому ли Моно проигрывает дотнету в 2-10 раз по скорости?


В основном из-за JIT-а.

Проигрыш в GC заметен только при сборе мусора, а этот проигрыш во многих сценариях не оказывает влияние. Гораздо интереснее время выделения памяти. А оно практически одинаковое.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[5]: язык C++ :)
От: vdimas Россия  
Дата: 10.03.06 23:25
Оценка: 20 (2) +1 :))
Здравствуйте, VladD2, Вы писали:

KT>>На свете много идиотов — усложнить простые вещи можно на любом языке!


VD>Несомнно, но согласись, С++ будто бы создан для этой задачи!


Я думаю, С++ создан для того, чтобы суметь познать себя. Через создание чертикакихногузадерищенко перлов многие проходят в самом начале познания C++... Т.е. это как сходящийся процесс калибровки инструмента с локальными выбросами, где инструмент — ты сам. Всех этих собак надо съесть самому, и нигде ты их так быстро не переваришь, как на плюсах. Не зря лучшие дотнетчики — это бывшие плюсовики, а не джависты


----------
Те, которые на некотором этапе создают крутонавороченные сложные сверх-нечитаемые перлы на самом деле имеют хоть какие-то шансы в нашей профессии. В отличие от тех, кто не то что составить, но даже и прочитать подобное не в состоянии.

----------
И просьба не путать нечитаемый макаронный код с действительно сложными наворотами.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[31]: плохой язык C++ :)
От: Sinclair Россия https://github.com/evilguest/
Дата: 11.03.06 06:44
Оценка: +1
Здравствуйте, AndrewVK, Вы писали:

AVK>Поинтересуйся, почему для хранения на диске используют не хеш-таблицы, а В+ деревья.

Ну, иногда все-таки используют. Правда, как я понял, у них несколько больше ограничений, чем у деревьев.
1.1.4 stable rev. 510
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[31]: плохой язык C++ :)
От: igna Россия  
Дата: 11.03.06 08:23
Оценка:
Здравствуйте, AndrewVK, Вы писали:

AVK>Поинтересуйся, почему для хранения на диске используют не хеш-таблицы, а В+ деревья.



Hashtable был взят только для примера, и лишь потому, что в .NET FCL отсутствует что-нибудь вроде BTree или BPlusTree. Что впрочем неудивительно, возможности эффективно использовать их все равно нет.
Re[30]: плохой язык C++ :)
От: VladD2 Российская Империя www.nemerle.org
Дата: 11.03.06 10:10
Оценка:
Здравствуйте, vdimas, Вы писали:

V>В основном из-за JIT-а.


И из-за джита тоже. Но ЖЦ влияет не меньше.

V>Проигрыш в GC заметен только при сборе мусора, а этот проигрыш во многих сценариях не оказывает влияние. Гораздо интереснее время выделения памяти. А оно практически одинаковое.


Потери есть на всех стадиях. Даже на стадии барьера записи.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[33]: плохой язык C++ :)
От: Cyberax Марс  
Дата: 11.03.06 10:25
Оценка: :)
AndrewVK wrote:
> C>Запросто — формировать кэш для быстрой работы. В .NET же используется
> GAC — чем я хуже?
> Ты это, если не знаешь что такое GAC, лучше его не упоминай.
Глобальный кэш сборок — прекрасно знаю что это такое. У меня будет
"Глобальный Кэш Документов"
Posted via RSDN NNTP Server 2.0
Sapienti sat!
Re[40]: плохой язык C++ :)
От: Cyberax Марс  
Дата: 11.03.06 10:41
Оценка:
alexeiz wrote:
> C>Ага, и то что allocator::pointer и allocator::const_pointer должны быть
> C>простыми указателями.
> C>Обещают исправить в C++09
> Ничего подобного. Новая модель аллокаторов не прошла. Она не дружит с
> временными копиями, RVO и rvalue reference.
А можно подробнее? В последнем mailing'е ничего такого не нашел (хотя
мог и пропустить).
Posted via RSDN NNTP Server 2.0
Sapienti sat!
Re[41]: плохой язык C++ :)
От: alexeiz  
Дата: 11.03.06 11:23
Оценка: 12 (1)
Здравствуйте, Cyberax, Вы писали:

C>alexeiz wrote:

>> C>Ага, и то что allocator::pointer и allocator::const_pointer должны быть
>> C>простыми указателями.
>> C>Обещают исправить в C++09
>> Ничего подобного. Новая модель аллокаторов не прошла. Она не дружит с
>> временными копиями, RVO и rvalue reference.
C>А можно подробнее? В последнем mailing'е ничего такого не нашел (хотя
C>мог и пропустить).

N1850 rejected:
http://groups.google.com/group/comp.std.c++/browse_thread/thread/4256d995bb96483b

WG21 meeting minutes of Octorber 3-8 2005:
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2005/n1915.html

N1850:
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2005/n1850.pdf
Re[41]: плохой язык C++ :)
От: alexeiz  
Дата: 11.03.06 11:25
Оценка:
Здравствуйте, Cyberax, Вы писали:

C>alexeiz wrote:

>> C>Ага, и то что allocator::pointer и allocator::const_pointer должны быть
>> C>простыми указателями.
>> C>Обещают исправить в C++09
>> Ничего подобного. Новая модель аллокаторов не прошла. Она не дружит с
>> временными копиями, RVO и rvalue reference.
C>А можно подробнее? В последнем mailing'е ничего такого не нашел (хотя
C>мог и пропустить).

Ну и здесь заодно: http://alexeiz.blogspot.com/
Re[42]: плохой язык C++ :)
От: Cyberax Марс  
Дата: 11.03.06 12:24
Оценка:
alexeiz wrote:
>> > C>Ага, и то что allocator::pointer и allocator::const_pointer должны быть
>> > C>простыми указателями.
>> > C>Обещают исправить в C++09
>> > Ничего подобного. Новая модель аллокаторов не прошла. Она не дружит с
>> > временными копиями, RVO и rvalue reference.
> C>А можно подробнее? В последнем mailing'е ничего такого не нашел (хотя
> C>мог и пропустить).
> Ну и здесь заодно: http://alexeiz.blogspot.com/
Ага, спасибо. Действительно у этой модели большие проблемы из-за попыток
совместимости со стандартными контейнерами.

Поэтому я бы согласился просто на добавление метода swap в стандартный
интерфейс аллокатора и разрешение умных указателей как
allocator::pointer, allocator::const_pointer. Ну и еще добавление
методов expand/shrink, которые будут пытаться расширить/сузить блок
памяти, без его перемещения.

Это не требует никаких особых изменений в Стандарте и семантике
стандартных контейнеров.
Posted via RSDN NNTP Server 2.0
Sapienti sat!
Re[6]: язык C++ :)
От: Lazy Cjow Rhrr Россия lj://_lcr_
Дата: 11.03.06 13:14
Оценка: 12 (1) +1
vdimas,

V>----------

V>Те, которые на некотором этапе создают крутонавороченные сложные сверх-нечитаемые перлы на самом деле имеют хоть какие-то шансы в нашей профессии. В отличие от тех, кто не то что составить, но даже и прочитать подобное не в состоянии.

V>----------

V>И просьба не путать нечитаемый макаронный код с действительно сложными наворотами.

Нисогласиин! Читать тяжелее.

"Действительно сложные навороты" неотличимы от макаронного кода в том смысле, что в обоих случаях очень высока плотность связей и сущностей на единицу площади исходников.

Разница в том, что в случае макаронного кода эти связи/сущности излишни, а в случае наворотов — необходимые шаги для реализации идеи.

Особенно различие в тяжести чтения/изложения становится тем больше, чем больше концентрация смысла в программе.

Ну и на закусь примерчики, уверен ты приведёшь ещё миллион.
1. реализация библиотек Loki, STL, Boost;
2. любая программа на языках с компактным синтаксисом, скажем K или J
quicksort =: (($:@(<#[),(=#[),$:@(>#[)) ({~ ?@#)) ^: (1<#)
Re: плохой язык C++ :)
От: Disappear  
Дата: 11.03.06 22:29
Оценка:
Здравствуйте, Зверёк Харьковский, Вы писали:

ЗХ>avva пишет


ЗХ>Следующие рассуждения в принципе мне кажутся очень простыми, но ни разу их не встречал.


[..skipped..]

ЗХ>Так вот, поэтому C++ — плохой язык.


Си позволяет совершать много нежелательных операций, поэтому многие простые ошибки программиста не обнаруживаются компилятором, а также даже когда они работают во время выполнения программы, что часто ведёт к программам с непредсказуемым поведением и уязвимым местам в безопасности (часто называемым «дырами»). Отчасти это произошло из-за того, что при разработке Си была поставлена задача избежать проверок при компиляции и выполнении программы для того, чтобы создавать максимально быстродействующий код и максимально простые компиляторы для новых платформ. В настоящее время существует множество дополнительных инструментов, облегчающих программисту работу по поиску распространённых ошибок и решению некоторых сопутствующих проблем.

Одной из таких проблем является то, что автоматически и динамически создаваемые объекты не инициализируются, поэтому в начале они имеют такое значение, какое осталось в памяти, выделенной для них, от ранее удалённых объектов. Такое значение полностью непредсказуемо, оно меняется от одной машины к другой, от запуска к запуску, от вызова функции к вызову. Если программа попытается использовать такое неинициализированное значение, то придёт к непредсказуемому результату. Большинство современных компиляторов пытаются обнаружить эту проблему в некоторых случаях.

Другим потенциальным источником опасных ситуаций служат указатели из-за того, что не происходит никаких их проверок. Указатель может указывать на абсолютно любой объект в памяти, включая даже и сам машинный код программы, что может приводить к непредсказуемым эффектам. Несмотря на то, что большинство указателей, как правило, указывают на безопасные места, они легко могут быть передвинуты в уже небезопасные области памяти с помощью арифметики указателей, память, на которую они указывают, может быть освобождена и использована по-другому («висячие указатели»), они могут быть неинициализированны («дикие указатели»), или же они просто могут получить любое значение путём приведения типов или присваивания значения другого повреждённого указателя. Другие языки пытаются решить эти проблемы путём использования более ограниченных типов ссылок.

Несмотря на то, что Си непосредственно поддерживает статические массивы, он не имеет средств проверки индексов массивов (проверки границ). Например, возможна запись в шестой элемент массива из пяти элементов, что естественно приведёт к непредсказуемым результатам. Это называется переполнением буфера, и часто является источником проблем защищённости программ, написанных на Си.

Ещё одной распространённой проблемой является то, что память кучи не может быть использована снова, пока она не будет освобождена программистом с помощью функции free(). В результате программист может случайно забыть освобождать эту память, но продолжать её выделять, занимая всё большее и большее пространство. Это обозначается термином утечка памяти. Наоборот, возможно освободить память слишком рано, но продолжать её использовать. Из-за того, что система выделения может использовать освобождённую память по-другому, это ведёт к непредсказуемым последствиям. Эти проблемы решаются в языках с автоматической уборкой мусора.

Функции с переменным количеством аргументов также являются потенциальным источником проблем. В отличие от обычных функций, имеющих прототип, стандартом не регламентируется проверка функций с переменным числом аргументов. Если передаётся неправильный тип данных, то возникает непредсказуемый, если не фатальный результат. Например, семейство функций printf стандартной библиотеки языка Си, используемое для генерации форматированного текста для вывода, хорошо известно за его потенциально опасный интерфейс с переменным числом аргументов, которые описываются строкой формата. Проверка типов в функциях с переменным числом аргументов является задачей каждой конкретной реализации такой функции, однако многие современные компиляторы в частности проверяют типы в каждом вызове printf, генерируя предупреждения в случаях, когда список аргументов не соответствует строке формата. Следует заметить, что невозможно статически проконтролировать даже все вызовы функции printf, поскольку строка формата может создаваться в программе динамически, поэтому как правило никаких проверок других функций с переменным числом аргументов компилятором не производится.

Для помощи программистам на Си в решении этих и многих других проблем было создано большое число отдельных от компиляторов инструментов. Такими инструментами являются программы дополнительной проверки исходного кода и поиска распространённых ошибок, а также библиотеки, предоставляющие дополнительные функции, не входящие в стандарт языка, такие как проверка границ массивов или ограниченная форма автоматической уборки мусора.


http://ru.wikipedia.org
Re[34]: плохой язык C++ :)
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 12.03.06 15:53
Оценка:
Здравствуйте, Cyberax, Вы писали:

C>Глобальный кэш сборок — прекрасно знаю что это такое.


Тогда может объяснишь какое он имеет отношение к быстрой работе и конвертации форматов? Здесь ничего про это не сказано. Может ты кеш ngen имел ввиду?
... << RSDN@Home 1.2.0 alpha rev. 646 on Windows XP 5.1.2600.131072>>
AVK Blog
Re[32]: плохой язык C++ :)
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 12.03.06 15:53
Оценка:
Здравствуйте, igna, Вы писали:

I>Hashtable был взят только для примера, и лишь потому, что в .NET FCL отсутствует что-нибудь вроде BTree или BPlusTree.


В свою очередб В+ крайне редко используют для хранения данных в памяти. Это я намекаю на то, что алгоритмы работы с диском и памятью чаще различаются, чем совпадают, ввиду того что характеристики доступа и скорости чтения у них различаются катастрофически и нелинейно.

I> Что впрочем неудивительно, возможности эффективно использовать их все равно нет.


При желании все можно. В том числе и MMF использовать.
... << RSDN@Home 1.2.0 alpha rev. 646 on Windows XP 5.1.2600.131072>>
AVK Blog
Re[30]: плохой язык C++ :)
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 12.03.06 16:34
Оценка:
Здравствуйте, vdimas, Вы писали:

V>Гораздо интереснее время выделения памяти. А оно практически одинаковое.


Было бы странно, если бы и там была разница.
... << RSDN@Home 1.2.0 alpha rev. 646 on Windows XP 5.1.2600.131072>>
AVK Blog
Re[44]: плохой язык C++ :)
От: Дарней Россия  
Дата: 13.03.06 02:29
Оценка: :)
Здравствуйте, Cyberax, Вы писали:

C>Тогда это уже не обратная, а прямая ситуация.


хоть горшоком назови, только в печь не ставь
Если отказаться от использования некоторых частей .NET, которые пока не в полном объеме реализованы в Моно — никаких проблем с переносимостью не должно быть. Даже если эти части используются, локализовать их и заменить — вполне тривиальная задача.

>> C>С++ поможет новый Стандарт и новые компиляторы.

>> новый стандарт только всё ухудшит. Но это уже тема для отдельного флейма
C>Конечно ухудшит Тот же C# будет по сравнению с ним выглядеть
C>маломощным карликом.

Скорее, новый C++ будет выглядеть многоножкой, которая запуталась в своих многочисленных ногах. Растущих не только с нижней стороны тела, но также с боков и даже сверху — из соображений совместимости с предыдущими версиями
Не говоря уже о том, что к тому моменту, когда опубликуют наконец новый стандарт С++ (и, что более важно, соответствующие ему компиляторы ) — M$ уже выпустит C# за версией 4.0. А независимые разработчики языков для .NET тоже не дремлют.
Вот ты сам как думаешь, когда появятся полноценные рабочие компиляторы для нового стандарта?
... << RSDN@Home 1.1.4 stable rev. 510>>
Всех излечит, исцелит
добрый Ctrl+Alt+Delete
Re[31]: плохой язык C++ :)
От: VladD2 Российская Империя www.nemerle.org
Дата: 13.03.06 06:05
Оценка:
Здравствуйте, AndrewVK, Вы писали:

AVK>Поинтересуйся, почему для хранения на диске используют не хеш-таблицы, а В+ деревья.


Используются и хэш-таблицы. Тоже своебразные. Но есть такой тип индекса HASHED INDEX.

В приципе выгоднее если по индексу делается только скан. Но огромного выигрыша нет, так как B-деревья имеют похожую на хэш-таблицы структуру. По большому счету вычисление страницы очень похоже на расчет кластера. А разница нивилируется из-за того, что нужно обращаться к диску.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[33]: плохой язык C++ :)
От: VladD2 Российская Империя www.nemerle.org
Дата: 13.03.06 06:05
Оценка:
Здравствуйте, AndrewVK, Вы писали:

AVK>В свою очередб В+ крайне редко используют для хранения данных в памяти. Это я намекаю на то, что алгоритмы работы с диском и памятью чаще различаются, чем совпадают, ввиду того что характеристики доступа и скорости чтения у них различаются катастрофически и нелинейно.


А знашь почему? В+ реализуется сложнее. А вообще-то он и в памяти выгоднее. Как минимум ее меньше тратит.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.