Здравствуйте, Alexéy Sudachén, Вы писали:
AS>Мне из какого файла STL привести кусок кода в качестве примера? ИМХО из любого. Я уж не говорю про силиконовый (или какой другой) протез, без которого писать на плюсах по человечески невозможно.
А что конкретно в реализации СТЛ вызывает затруднения?
AS>В остальном, можно по существу что напрягает адепта двух плюсов в этом коде? Макросы? Это как бы прямой путь реализации многих вещей в С, и не надо тащить своё табу ни них из плюсов. Минимальное знание самого языка, а не приёмов построения рекурсивного шаблонного бреда... ну, ё-моё, избавляйтесь от вредных привычек и учите синтаксис.
М... Ты уже научил интеловский компилер синтаксису С?
Ну и проверять, справляется ли оптимизатор с такими построениями -- не самая интересная задача.
AS>Хотя мы вроде как не о реализации рантайма спорили, а о том можно ли написать на С код с автоматическим управлением ресурсами толерантный к исключениям, я привёл РАБОЧИЙ (в отличии от тебя) пример что можно, и очень просто. На больших объёмах кода проще чем в плюсах, между прочим. Но уж коли мы пошли в реализацию...
Здравствуйте, Erop, Вы писали:
E>Просто ему статья Страуст. слегка помыла мозг примером qsort vs std::sort.
Не думаю. Пример на самом деле отлично демонстрирует разницу между обычной функцией с callback и шаблонной функцией с предикатом.
E> Он даже не верит, что может быть ситуация, когда qsort гибче и когда qsort быстрее
Дык я тоже не верю, мне доказательства нужны.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
Здравствуйте, Erop, Вы писали:
CC>>Сколько бы у тебя опыта не было — недостаток автоматики в С это никак не исправляет. С этим можно только смириться и писать всё руками. E>Обсуждалось совсем другое, вроде как.
Да тут уже такой срач развели что тяжко отследить что там на самом деле обсуждали.
Надо всю ветку сносить к троллям в КСВ .
E>А так, да, можешь считать, что С-программы намного в болььшей степени hand-made
Да чего там считать, я на plain C пописал достаточно чтоб за это его недолюбливать.
E> потому и хороши.
Не соглашусь. Как только надо писать что либо относительно крупное то это становится нефиговым недостатком. Очень много времени уходит на восходы и закаты небесных светил вручную. Особенно ощущается когда с другого языка приходишь.
E>Выписанность кода руками вообще не считается недостатком, это достоинство.
Вот тока когда сам эти художества выписываешь, причём дофига выписываний это то, что в том же С++ работает автоматически, то как то заколёбывает. Хочется воткнуть нормальные классы, операторы, контейнеры и прочие радости жизни.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
P>>>>>>Я не совсем понял, вы используете подмножество C++ ? P>>>>>> Или просто C? AS>>>>>С и С++ разные языки. Считать один подмножеством другого — большая ошибка, говорящая о незнании одного из языков, ну или обоих. P>> это был не вопрос, а цитата, с целью ткнуть тебя в то, что я знаю что С — не полностью входит в C++. а ты распетушился...
Молодец, ткнул. Возьми конфетку )))
С примером, в котором очевидно где 'видно что безопасней и легче', когда тыкать будешь?! А то мне прям как-то интересно даже. Чувствую во мне тролль просыпается и жрать хочет. Надо ещё наверное C-стайл пример с сортировкой привести, шоб ваще весело стало )))) Хотя не, давай сначала с управлением ресурсами разберёмся.
Здравствуйте, Piko, Вы писали:
P>вы понимаете, что абстракции могут иметь разные реализации. и да, некоторые могут быть медленней. P>но, у нас как бы разговор, и есть определённый контекст. P>Конкретно я имею ввиду, что C++ позволяет писать более абстрактный, более безопасный, и более быстрый код — и всё это одновременно.
Дабы завершить наши препирательства:
Изначально я и обратил ваше внимание, на то, что С++ не позволяет писать более быстрые приложения, чем С. http://www.rsdn.ru/poll/3562.aspx
К моей радости, большая часть аудитории данного форума это понимают. И я даже не знаю, как объяснить это вам, потому, что это фундаментальное знание — и если вы знаете С++, вы понимаете, почему так.
Могу лишь понадеется, что в будущем, когда у вас будет больше опыта вы поймете, почему были неправы.
Здравствуйте, Piko, Вы писали:
P>Это распространённое заблуждение, что код на C более быстр и менее требователен. Если важна эффективность, C++ легко позволяет писать более оптимальные программы чем C.
Слушай, чего ты разоряешься? Хотят писать на С — хай пишут. Это их геморрой.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
Здравствуйте, 11molniev, Вы писали:
1>Если вы знаете, что токае ассемблерный листинг, то уж должны то понимать, почему на С++ нельзя писать код более быстрый, чем на С. Равный да. Медленней да. Быстрей нет.
Это неочевидное утверждение, как минимум. Вообще-то транслятору, а значит и оптимизатору С++ программы, доступно больше, чем транслятору и оптимизатору С, ну и мелочи всякие вроде исключений, тоже не стоит сбрасывать со счетов
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, Erop, Вы писали:
E>Суть в том, что на С и С++ пишут ПО РАЗНОМУ.
Капитан на линии?
E>Но прикольно тут не это, а то, что вам с Пико было не очевидно, как получить пример тормозов std::sort'а...
Конкретно сам std::sort алгоритмически не идеален, факт. Я прекрасно понял на что ты намекаешь — на использование оператора сравнения c семантикой bool operator < (), т.е. чтоб проверить на == надо его вызывать дважды.
Вот только разговор шёл не об этом. А о темплейтном коде с предикатом.
Берём твой тест счётчик вызовов компаратора.
Лёгким движением руки делаем простой тест: клонируем std::sort, и меняем там предикат так, чтоб он принимал int (< 0, == 0, > 0).
Меняем соответственно вызывающий код.
#include <CrayLib.h>
#include <stdlib.h>
#include <algorithm>
#include <vector>
class RandNum {
int body;
static int countCpp;
static int countC;
public:
RandNum() : body( rand() ) {}
static int CmpImpl( const RandNum* arg1, const RandNum* arg2 )
{ countC++; return arg1->body - arg2->body; }
static int CPPCmpImpl( const RandNum& arg1, const RandNum& arg2 )
{ countCpp++; return arg1.body - arg2.body; }
static int Cmp( const void* arg1, const void* arg2 ) { return CmpImpl( (const RandNum*) arg1, (const RandNum*) arg2 ); }
static const int CppCount() { return countCpp; }
static const int CCount() { return countC; }
};
int RandNum::countC = 0;
int RandNum::countCpp = 0;
void RN_test( int n = 1000 )
{
std::vector<RandNum> arrCpp;
for( int i = 0; i < n; i++ ) {
arrCpp.push_back( RandNum() );
}
std::vector<RandNum> arrC( arrCpp );
qsort( &arrC[0], arrC.size(), sizeof( RandNum ), RandNum::Cmp );
mod_sort( arrCpp.begin(), arrCpp.end(), [] (const RandNum& a, const RandNum& b) {return RandNum::CPPCmpImpl (a, b);});
printf ("C: %u : C++: %u\n", RandNum::CCount(), RandNum::CppCount());
printf ("%u\n", RandNum::CppCount() * 100 / RandNum::CCount());
}
int main ()
{
RN_test ();
}
И внезапно получаем:
C: 12048 : C++: 11866
98
E>вы и правда не видите, что std::sort пессимизирован в угоду красоте и реюзабельности кода, я просто показал вам код и пример.
Мы не обсуждаем конкретную реализацию std::sort. Мы обсуждаем подход: шаблонный код с вкомпиливаемым компаратором vs отдельный заранее скомпиленный код с функцией-компаратором.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
Здравствуйте, Piko, Вы писали:
P>Я вопрос задал не ради предубеждения или холивара. P>Мне действительно интересно, где сейчас реально может понадобится чистый C, и не подойдёт использование C++ (какого-либо его подмножества).
Речь не идет о "чистом Си", речь идет о его "осовремененном" диалекте — формально, о "стандарте" 99 года.
Только законченному идиоту придет в голову писать ОС, или упаси бог, ядро этой ОС на С++, используя концепцию ООП, особенно в CLI нотации.
Я успешно использую Си и С99 в двух "почти" своих проектах, ( не могу сказать каких, в виду подписанного мною NDA ).
И в 80-90% случаев предпочитаю использовать С99 при создании игр, и ОС RMOS для своего парка техники ( роботроника )
P.S. Я не отказываюсь от ООП, если вы это имели ввиду. Просто у нас с Б. Страуструпом разные точки зрения по этому поводу
AS>>Ну, по причине неадекватной сложности, ведущей к постоянной борьбе с языком, и постоянного вынужденного скатывания к синтаксическому онанизму. Плюс к тому ещё и высокая сложности разбора крешей в случае использования 'правильных' либ. P>если какие-то средства языка сложны для вас в использовании — не используйте их, если какие-то либы для вас не удобны — не используйте их, но это не причины баннить весь язык и все либы.
Дык, он же весь такой )))
P>что привело? переписывание на C? Так может если бы второй раз на C++ переписали, получилось бы не хуже? P>Я не совсем понял, вы используете подмножество C++ ? P>Или просто C? Как объектную модель можно на C сэумлировать — мне понятно. Но вот исключения и автоматическое управление ресурсами на С — сходу не соображу как сделать.
С и С++ разные языки. Считать один подмножеством другого — большая ошибка, говорящая о незнании одного из языков, ну или обоих.
То что вы чего-то не видите или не соображаете, означает ровно то что означает. Как сделать я уже не раз писал.
Тут нельзя сказать хуже/лучше. Проще, понятнее, удобнее ... всё субъективные характеристики.
Вот вам как пример одного из аспектов (а их много...), кошмарный сон — представьте себе что вы такой крутой С++ программер, ну скажем, один такой крутой на целый на город. Александреску там вкуриваете с полпинка, на шаблонах не материтесь, а прямо таки излагаете. И в коде у вас прямо таки полный фашизм контроль и порядок, все байты по струнке ходють. Круто да? И вдруг вам нужно часть своей работы делегировать кому-то ещё... упс, да?
AS>>Как бы для уточнения, я использую С не по тому что не знаю или не умею готовить С++, но именно по тому что неплохо умею готовить и тот и другой. Дык вот, старый добрый С оказался на практике гораздо приятнее. P>ну — дело ваше, кому-то на ассемблере приятней.
Ну вот и ладненько )
AS>>То что С++ как-то сильно влияет на обнаружение ошибок в отличии от С — миф. P>Как реализовать на C: ....
А зачем? Вам это как-то РЕАЛЬНО хоть раз помогло? Мне нет. А с поправкой на весь синтаксический онанизм что с этим связан, это ваще бессмысленно и даже вредно.
Здравствуйте, Piko, Вы писали:
AS>>С и С++ разные языки. Считать один подмножеством другого — большая ошибка, говорящая о незнании одного из языков, ну или обоих. P>Что мешает использовать то подмножество C++, которое комфортно вам? (я знаю что множество C не полностью входит в C++)
Тем что это не даёт возможности решать задачу в терминах С. Недоступны принципиальные возможности, дико порицаемые адептами двух плюсов. Если вы сможете компилировать свой C код C++ компилятором, то вам просто кажется что вы пишете на С, но на самом деле лишь на подмножестве С++.
Ну и самое важное, человек будет писать на кастрированном С++! Чётко понимать это и постоянно донимать работодателя на тему разрешить от эту и от эту фишку С++, что в конечном случае приведёт к тому к чему всегда приводит — вместо решения задачи, будет решаться задача как это правильно сделать на С++. Иначе говоря люди будут вместо работы заниматься синтаксическим онанизмом, результат которого для понимания будет требовать ещё большей квалификации чем та которая была у аФФтАра.
ИМХО, но страус просто неАсилил научится писать на С )))
AS>>То что вы чего-то не видите или не соображаете, означает ровно то что означает. Как сделать я уже не раз писал. P>если вам трудно описать как вы используете автоматическое управление ресурсами на C и исключения, хотя бы в паре предложений, я не вижу смысла продолжения моего общения с вами
Дык, сделайте усилие, небольшое такое, гляньте хотя бы в избранное что ли. На КЫВТ'е все такие гордые, что даже брезгают посмотреть чего до этого писал их собеседник. ))) То что вы смысла не видите, дык енто дело сугубо ваше. Неужто вы думаете, меня сколь бы то ни было расстроит, что вы сужаете своё восприятие действительности?!
P.S.
Я сюда не для просвещения страждущих хожу, мне сие с некоторого момента сугубо фиолетово, но троллинга и флуда ради. Короче, поразвлекаться.
Здравствуйте, Piko, Вы писали: RSA>>1) реализовывать весь проект на gcc (ИМХО особый род мазохизма при наличии студии); RSA>>2) использовать студию для отладки/написания с++ кода и gcc/gdb для отладки с99 кода, при таком подходе отладка на стыке компиляторов превращается в достаточно увлекательный квест; RSA>>3) портирование с99 кода в с++ — квест получаем увлекательный и итеративный, т.к. нужно отрабатывать выход новых версий и bug/security фиксы. RSA>>*) другие не очень привлекательные варианты.
P>ещё возможные варианты (я их не тестировал, полностью не уверен): P>4) Intel C вроде понимает C99, и не плохо интегрируется со студией
сколько стоит интересно...
P>5) CLang/LLVM
недавно портировал некоторое количество кода из студии в XCode 4.3, получил забавную ошибку (может и я конечно чего то не понимаю):
template<typename t1>
class A
{
protected:
int m_i;
};
template<typename t1, typename t2>
class B: public A<t1>
{
public:
void foo() { ++m_i; }//веселье тут - говорит, типа не знаю никаких m_i... пришлось this->m_i; ну или ++A<t1>::m_i;
};
не уверен что повторил на 100% точно, но что то в этом духе.
P>6) автотрансляция кода с С99 в более старую версию
меня гложут смутные сомнения что в этой области неба безоблачно...
Здравствуйте, Piko, Вы писали:
AS>>Ну, по причине неадекватной сложности, ведущей к постоянной борьбе с языком, и постоянного вынужденного скатывания к синтаксическому онанизму. Плюс к тому ещё и высокая сложности разбора крешей в случае использования 'правильных' либ. AS>>Привело к серьёзному упрощению кода, который теперь можно понять не изучая в течении нескольких лет методы высокой магии и прорицания в пространствах синтаксических подсластителей.
P>Синтаксический онанизм говоришь? методы высокой магии? прорицание в пространствах синтаксических подсластителей? серьёзное упрощение кода? P>ну-ну :
Ох, порвал как тузик грелку!
Мне из какого файла STL привести кусок кода в качестве примера? ИМХО из любого. Я уж не говорю про силиконовый (или какой другой) протез, без которого писать на плюсах по человечески невозможно.
Я согласен что для идиотов, что не знают самого языка, но с упоением спорят о метафизики и шаблонах, пара свичей ещё тот бетхерт, но вот проблема — содержимое продукта лихорадочного бреда Степанова сих индивидуумов ваще вгонит в глубокий когнитивный диссонанс, а силиконовые сиськи порвут как капля никотина хомяка. Но кто же лазит разбираться как устроены сиськи?
В остальном, можно по существу что напрягает адепта двух плюсов в этом коде? Макросы? Это как бы прямой путь реализации многих вещей в С, и не надо тащить своё табу ни них из плюсов. Минимальное знание самого языка, а не приёмов построения рекурсивного шаблонного бреда... ну, ё-моё, избавляйтесь от вредных привычек и учите синтаксис.
Хотя мы вроде как не о реализации рантайма спорили, а о том можно ли написать на С код с автоматическим управлением ресурсами толерантный к исключениям, я привёл РАБОЧИЙ (в отличии от тебя) пример что можно, и очень просто. На больших объёмах кода проще чем в плюсах, между прочим. Но уж коли мы пошли в реализацию ... ты можешь менять реализацию под конкретную платформу в С++, ой а шо так? Или хотя бы иметь гарантии по способу реализации механизмов, или хотя бы гарантии что они вообще реализованы? Вопрос типа риторический. )
Здравствуйте, Piko, Вы писали:
P>>>Это распространённое заблуждение, что код на C более быстр и менее требователен. Если важна эффективность, C++ легко позволяет писать более оптимальные программы чем C. CC>>Слушай, чего ты разоряешься? Хотят писать на С — хай пишут. Это их геморрой.
P>Если честно, хотелось услышать аргументы против. В ответ услышал старые перепетые мифы, и ни одного аргумента
[надевая пенсне]
Ой ну ви таки послушайте наконец старого одесского тролля жителя: таки ничего вам тут нового не скажут! Все их стереотипы провоняли нафталином, ну так и хай они себе дальше грызут свой кактус, если они считают что по вкусу он аккурат как текила.
[снимая пенсне]
Забей. Проще пристрелить чем добиться аргументированного ответа.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
Ты не улыбки ставь а на вопросы ответь.
А то блаблабла ты умеешь, как насчёт аргументированного и развёрнутого ответа, базирующегося исключительно на проверяемых фактах?
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
Здравствуйте, Erop, Вы писали:
E>Не затруднит пояснить с чем конкретно ты не согласен и почему? Ну кроме тона...
С формулировкой в стиле "первые 10 лет в тюрьме тяжело, а потом привыкнешь".
Сколько бы у тебя опыта не было — недостаток автоматики в С это никак не исправляет. С этим можно только смириться и писать всё руками.
CC>>Советовать. E>IMHO, советую как-то иначе, в иных тонах и наклонениях и т. п...
Тон бывает в устной речи. Как его углядеть в тексте —
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
P>А зачем вообще может понадобится использовать C, когда есть C++ ?
В С99 есть киллер фича — динамические массивы. Сразу, пока меня не ткнули в вектор — их можно создавать на стеке, и тогда они
а. быстрее
б. не приводят к фрагментации памяти.
Кроме того, С компилятор не делает манглинга — что очень важно, если пишешь бинарную библиотеку.
И наконец, сообщения об ошибках от С компилятора, как правило, в разы более вменяемые.
В остальном для компиляции С кода можно использовать компилятор С++ — бинарник, который он будет делать, гарантированно не будет хуже, чем тот, который бы произвел С компилятор на том же самом исходнике.
Здравствуйте, Piko, Вы писали: P>Конкретно я имею ввиду, что C++ позволяет писать более абстрактный, более безопасный, и более быстрый код — и всё это одновременно.
Но очень мало кто умеет это делать. Кроме того, если вернуться к реальности, то кодер. который хреначит тысячи строк простого С-подобного кода в день и выдаёт приемлемое качество, намного дешевле мегаперца, который вам всё супер-пупер спроектирует и реализует, так, что это будет более абстрактный, безопасный и быстрый код одновременно, и не write-only при этом
Кстати, то, что код более абстрактный, часто не является ценностью. Ценностью является естественность выражения бизнес-логики в реалиях программы и кода
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, coba, Вы писали:
C>не лажает, просто у нет такой у неё цели, еще в момент появления С99 они открыто сказали, что цель поддерживать С99 перед собой не ставят, концентрируя своё внимание на С++.
Эх, если бы... Все же видели, как они C++11 продвигают, в VC11 кроме библиотеки почти ничего не поменяли, default-delete, enum class, да range-based for, который у них и так был в виде for each(a in b), только синтаксис переделали.
Переубедить Вас, к сожалению, мне не удастся, поэтому сразу перейду к оскорблениям.
Здравствуйте, org_256, Вы писали:
AD>>Здравствуйте, org_256, Вы писали: _>>>А мое сугубо субъективное мнение, многократно подтверждаемое моим субъективным опытом, _>>>вряд ли вам будет интересно...
AD>>Нет, нет. Мне очень интересно.
_>Тогда объясните, чего конкретно вы от меня желаете услышать???
Примеры из вашего субъективного опыта, подтверждающие ваше высказывание. Достаточно одного примера.
Здравствуйте, org_256, Вы писали:
_>Какое именно высказывание? Хотелось бы побольше конкретики... ( Выделенное жирным вырвано из контекста )
Вот это:
_>Речь не идет о "чистом Си", речь идет о его "осовремененном" диалекте — формально, о "стандарте" 99 года. _>Только законченному идиоту придет в голову писать ОС, или упаси бог, ядро этой ОС на С++, используя концепцию ООП, особенно в CLI нотации.
Здравствуйте, ArtDenis, Вы писали:
AD>Здравствуйте, org_256, Вы писали:
_>>Какое именно высказывание? Хотелось бы побольше конкретики... ( Выделенное жирным вырвано из контекста )
AD>Вот это:
_>>Речь не идет о "чистом Си", речь идет о его "осовремененном" диалекте — формально, о "стандарте" 99 года. _>>Только законченному идиоту придет в голову писать ОС, или упаси бог, ядро этой ОС на С++, используя концепцию ООП, особенно в CLI нотации.
AD>в сообщении http://www.rsdn.ru/forum/cpp.applied/4730945.1.aspx
Вы ожидаете от меня услышать что то что можно оспорить. Я повторяю, ничего объективного, т.е. фактического, обусловленного объяснением за пределами конкретной личности ( индивида ), вы от меня не услышите, потому-что просто не захотите слушать. А мое субъективное мнение( т.е. мнение, сформировавшееся за счёт личного, субъективного опыта, характерного только для меня) вас вряд ли порадует. За сим не вижу смысла в вашем вопросе.
Если вы действительно просто желаете спорить, или убедить меня в чем-то ( подозреваю собака тут покопалась ), то боюсь к сожалению вам придется указать мне успешные конкурентноспособные ОС преимущественно ядро которых написано на С++... если таких нет, какой смысл дальше препираться?
Здравствуйте, org_256, Вы писали:
_>Если вы действительно просто желаете спорить, или убедить меня в чем-то ( подозреваю собака тут покопалась ), то боюсь к сожалению вам придется указать мне успешные конкурентноспособные ОС преимущественно ядро которых написано на С++... если таких нет, какой смысл дальше препираться?
Я же написал: мне действительно интересен любой ваш опыт по этому вопросу. Я хочу не спорить и припираться. Я хочу послушать любые аргументы или случаи из личного опыта в пользу вашего высказывания, не смотря на то, что они будут даже не из области написания ядра ОС на С++.
Здравствуйте, Piko, Вы писали:
P>Здравствуйте, 11molniev, Вы писали:
_>>>>>>1. Большую часть времени я пишу для платформы с большим ограничением по пространству-времени. ( робототехника ) P>>>>>Это распространённое заблуждение, что код на C более быстр и менее требователен. Если важна эффективность, C++ легко позволяет писать более оптимальные программы чем C. 1>>>>Вы можите аргументировать, почему С++ позволяет писать более оптимальные программы? Равные — безусловно. При равном объеме кода — тоже. Но в общем случае "более", звучит довольно странно. P>>>http://www.rsdn.ru/forum/cpp/4731645.1.aspx
P>>>пример qsort vs sort. P>>>В qsort — runtime decision, в sort — compile-time, отсюда и скорость. И это не единственный пример. 1>>Я то понимаю разницу между ними, но в том то и дело, что в чистом Си обычно именно compile-time. P>Ну так там где в C возможно compile-time, оно возможно и в C++, причём в C++ — оно достигается намного легче/лучше/красивее. Я не призываю раздувать иерархии классов с виртуальным методами, там где возможно compile-time, и да я признаю что многие C++ проекты страдают от этого (из-за низкой квалификации разработчиков, и из-за слепого применения методов из других языков и т.п.)
Дык о том речь, что runtime decision получаеться в Си только посредством усилий разработчика, а в плюсах и без оных.
_>>>>>>7. Если бы все мои задачи требовали быстрого решения и реализации и не были бы требовательны к скорости выполнения и размерам кода, то да, я бы стал использовать С++ постоянно, даже не смотря на то, что этот язык просто чисто физически не возможно выучить на все 100%. P>>>>>даже выучив 50% C++, вы сможете делать более быстрые программы чем на C, либо более компактные чем на C (вообще одновременно максимальная компактность и максимальная скорость почти никогда не достигаются одновременно, в том числе и на C) 1>>>>Вопрос к пункту один. P>>>ну так я не говорил что всегда одновременно получается достигнуть и скорость и компактность. либо то, либо другое, причём на C++ обе цели (по отдельности) достигаются легче чем на C. 1>>ОК. Компактность — безусловно. Но скорость то на С++ достигается за счет legacy C. P>это заблуждение. std::sort — это legacy C? expression templates — это legacy C? и т.п.
std::sort, expression templates, это способ уменьшить объем кода, а не ускорить его выполнение. В чем заблуждение?
P>>>Вы понимаете почему std::sort быстрее? Посмотрите на ссылки которые я дал — там sort в несколько раз быстрее. 1>>Быстрей, потому что qsort делает вызовы функции сравнения. Лишние call/ret + использование стека по сравнению с С++. P>даже если вызов функции сравнения в C++ не заинлайнится (то есть будет call/ret + stack), sort всё равно будет быстрее, так как прямой вызов.
qsort из Си будет медленней, чем std::sort. std::sort будет медленней алгоритма сортировки для double*. C++ выигрывает в скорости при одинаковом объеме кода, проигрывает при разном.
1>>Реализация qsort под массив float без callback-a будет быстрей std::sort. 1>>И таки не в несколько раз: 1,7 для 32 и 1,4 для 64 кода. P>Это ещё почему? для std::sort callback'и как правило инлайнятся.
Потому что оверхейд больший. Если хотите скину код, состряпанный на скорую руку. Для qsort кстати функция сравнения не инлайница — разница в скорости 32/64 скорей всего объединяться разной формой передачи аргументов по умолчанию (не проверял, могу ошибаться).
P>>>не согласен: во-первых больше кода — больше ошибок, во-вторых такие штуки как RAII исключают возможность целых классов ошибок — то есть если вы знаете и используете RAII, то вы чисто технически не сможете сделать целую кучу ошибок. 1>>Это (в том числе и RAII) компенсируется в Си стандартом кодирования + выделением отдельного слоя api. Гарантия конечно не такая надежная, люди ошибаются чаще машин — но вполне себе работает.
P>так я не говорю что оно "вообще не работает". оно работает, но на C++ оно получается быстрее и безопасней. P>ну вот пример, в блоке кода, пусть в функции, нужно при входе захватить мьютекс, открыть файл, и выделить память, при выходе соответственно нужно всё убрать. P>Вы можете показать как это делается на C (в более-менее псевдокоде, 100% компилируемый исходник не нужен. просто используйте C-style), причём безопасно, с обработкой ошибок. + показать вызов такой функции.
ОК, я не стал все копировать, но общие моменты я думаю будут ясны.
В stdafx.h:
#define MALLOC(x) (x*)memalloc(sizeof(x))
#define ZEROPTR(x) memset(x, 0, sizeof(*x))
#define SAFEALLOC(xpointer, xtype) { xpointer = MALLOC(xtype); RETNULL(xpointer); ZEROPTR(xpointer); }
#define RETNULL(x) if (NULL == (x) ) goto ret;
#define CODE_ERROR SIZE_MAX
#define CODE_SUCCESS 0
#define RETERROR(x) { if (CODE_SUCCESS != x) goto ret; }
#define RETEQU(x, y) if ( (y) == (x) ) goto ret;
В коде:
t_error function name(...) {
HANDLE h = INVALID_HANDLE_VALUE;
struct name *name;
void * p = NULL;
t_error = CODE_ERROR_BAG...;
....
EnterCriticalSection(&cs);
SAFEALLOC(name, struct name);
RETEQU(INVALID_HANDLE_VALUE, h = CreateFile(...) );
RETNULL( p = memalloc( ... ) );
1>>В качестве примера можно привести nginx — чистый Си, ничего не течет.
P>вообще не аргумент. P>можно что угодно написать хоть на ассемблере без протечек...
И да и нет. Подобный пример опровергает утверждение, что больше кода — больше ошибок. Есть ещё человеческий фактор.
Здравствуйте, Piko, Вы писали:
P>Здравствуйте, 11molniev, Вы писали:
P>>>а чем принципиально indirect call отличается от virtual call в контексте runtime decision? и то и то получается посредством усилий разработчика 1>>В С эти усилия всегда в явном виде. С++ можно и без усилий получить их по дефолту. Проще говоря на чистом Си тормоза всегда являются результатом осознанного решения разработчика. Только то и всего. P>а где в C++ их можно получить по дефолту, да так чтобы не знать об этом? P>я когда пишу virtual — всегда осознаю, что в 99% случаев это будет indirect call через vtable
Сама концепция объекта как черного ящика их предполагает.
P>>>или вы имеете ввиду то, что для любого C++ кода можно написать аналогичный C код? если да, то я и не спорю — да можно, есть даже авто трансляторы с C++ на C. вот только размер аналогичного С кода будет не меньше, а в большинстве случаев больше в разы. 1>>Нет. Я имею в виду, что получить максимальную скорость в плюсах можно используя для критичных участков кода чистый Си. Если вместо вызова std::sort вы напишите быстрою сортировку на си, она будет работать быстрей. P>надо попробовать в эту ручную сортировку привести к интерфейсу std::sort, может разность в скорости обуславливается разными алгоритмами?
Разница обусловлена только тем, что std::sort будучи функцией с большей функциональностью (в плане данных над которыми она применяется) за эту функциональность платит скоростью. Более общее решение всегда медленней частного.
Я честно сказать не совсем улавливаю о чем мы спорим: С++ даст более компактный код. С даст более быстрый код. С++ со вставками legacy в нужных местах даст скорость, во всех остальных — компактность. Если пропихнуть вместо legacy С asm — будет ещё быстрей (если конечно есть опыт программирования на нем и время на профайлер).
1>>Ещё раз — qsort, это быстрая сортировка на Си для произвольных структур. Она заведомо проигранная в скорости. Осознанный выбор, когда в этом месте программы на её скорость можно наплевать. 1>>Да размер кода будет больше. Я собственно везде об этом и говорю. Лично для меня основное преимущество С++, когда я использую его, вместо С — это объем кода. P>ну да, на С можно сделать тоже самое, но кода почти всегда будет больше. И вот этот дополнительный код на C, который автоматом генерируется на C++, зачастую и не пишется.
Да вы правы. Но у меня сложилась мнение, что вы считаете это только недостатком. Я же полагаю, что иногда это недостаток, а иногда достоинство.
1>>>>std::sort будет медленней алгоритма сортировки для double*.
P>>>вы имеете ввиду специальные алгоритмы (типа Radix sort) отличные от quicksort? P>>>ну так C++ и в этом месте лучше — можно сделать специализацию для double*, либо вообще для T* — причём интерфейс не поменяется. 1>>Да нет же. И шаблоны я знаю. 1>>>>C++ выигрывает в скорости при одинаковом объеме кода, проигрывает при разном. P>>>вы имеете ввиду использование специальных алгоритмов, для специальных случаев? 1>>Нет. P>я просто пытался понять, что вы имели ввиду...
В коде образец. Я постараюсь объяснить, если вы сформулируете вопрос.
1>>>>Если хотите скину код, состряпанный на скорую руку. P>>>если не трудно — то скиньте, мне будет интересно. можно сюда, а можно в http://ideone.com/ 1>>http://pastebin.com/YsGRBtZ0 — только #include "stdafx.h" уберите, я забыл 1>>http://ideone.com/iL6Gb 1>>На скорую рука, так что не очень, но общий подход иллюстрирует. P>http://pastebin.com/QXPU0zWC P>test_c2 и test_cplusplus3 по скорости примерно одинаковы.
На N=100000000, qsort: 28.758331, std::sort: 20.791297, c: 17.333931 соотношение 1,38 и 1,199
На N=10000000 qsort: 2.567289, std::sort: 1.824936, c: 1.510803 соотношение 1,40 и 1,20
т.е. то о чем я говорю: переписывания куска кода на чистый с раздуло этот код и ускорило его работу на ~20 процентов. В два раза меньше чем использование std::sort вместо qsort — так что цифры увеличения скорости вполне сопоставимы.
Единственный момент: это 64 разрядный код, std::sort при N=100000000 на 32 битах вылетело с исключением)). Для 32 qsort vs std::sort получается в районе 1,6.
1>>>>Для qsort кстати функция сравнения не инлайница P>>>браво 1>>Я обратил ваше внимание на то, почему в приведенном вами сравнении выигрывает С++. И как это исправить. P>да, именно, не инлайница/indirect call это основные факты почему быстрее..
Но неинлайница, потому как qsort — функция "обобщенная". И по факту в коде она не используется. Ну как wchar_t под unix. Наверное самая близкая аналогия.
P>>>>>Вы можете показать как это делается на C (в более-менее псевдокоде, 100% компилируемый исходник не нужен. просто используйте C-style), причём безопасно, с обработкой ошибок. + показать вызов такой функции. 1>>>>ОК, я не стал все копировать, но общие моменты я думаю будут ясны.
P>>>вот буквально за 10 секунд увидел: P>>>Я правильно понимаю, если это сфейлится 1>>>> RETNULL( p = memalloc( ... ) ); P>>>то это 1>>>> LeaveCriticalSection(&cs); P>>>не вызовется? 1>>Да. Её следовало вынести за ret. P>с указателями конечно немного легче тем, что free ничего не делает для для нулевых указателей. P>Но вот чтобы вы сделали если бы было 3 совершенно абстрактных ресурса? Делали бы 3 метки?
Нет, никогда. Обращаю внимание на макросы — в них забита одна ret. В том то и смысл, что есть инициализатор. Если бы free и CloseHandle не делали этого по умолчанию сами, это выгладило бы как:
if (p) free(p);
if (INVALID_CLOSE_HANDLE != h) CloseHandle(h);
Но обычно в этом нет необходимости.
1>>И? Померились? P>?? я с вами мерится не собирался, мне интересно сравнение C vc C++, без личностей...
Извините, если восприняли, как переход на личности (хотя подтекст не скрою)) ). Просто очевидно, что С предоставляет меньшие возможности по инициализации/освобождению ресурсов и в подобных сравнениях кода на С будет больше, чем на плюсах. Особенно если классы выносить из описания)). Поэтому я лично слабо улавливаю, что вы хотите показать этим сравнением. Код на С++ компактней. Ну так в этом то наши мнения совпадают.
Я кстати как то не обращал внимания на такой способ захвата объектов синхронизации, так что спасибо за ваш пример.
P>>>причём try, может быть намного выше в call hierarchy, когда в C надо сравнивать код всё время. 1>>И ещё чаще его там в итоге не будет для выбрасываемого типа исключения))) P>catch(std::exception const& e){} P>catch(...){}
Это то да. Просто некоторые "программисты" как то не удосуживаются об этом задумываться. Пихают везде буст, а исключения его нигде не ловят. Но это разуметься не в коей мере не относиться к языку.
P>>>Я думаю даже без причёсывания вашего C-style варианта, видно что безопасней и легче. 1>>Чем меряете безопасность и легкость кода? Всетаки субъективные критерии. Помимо наличия конструкторов и деструкторов.
P>легкость: кода меньше. код лаконичней. вообще не надо парится об корректном сборе ресурсов. P>безопасность: кода меньше. код лаконичней. вообще не надо парится об корректном сборе ресурсов.
P>вы в своём коде сделали ошибку, я думаю наверняка не одну. проблема не в вас, а в самом подходе, я бы тоже сделал ошибку в вашем случае, потому что код намного сложнее.
Отчасти я с вами согласен. Но и вы отнеситесь с пониманием: С язык очень простой. Фактически — простыня вызова функций. Поэтому когда сложный алгоритм предварительно просчитан, разбит на составляющие, использование си приводит к тупому переносу алгоритма с одного языка на другой. И это тоже уменьшает ошибки. Да на С++ кода меньше и он лаконичней, но это достигается его большей информационной емкостью, а значит повышает сложность. Смотрите сами: есть класс — значит есть конструктор/деструктор, есть операция — может быть перегружена и так далее. Это уменьшает объем кода, но дизассемблерный листинг то остается один и тот же (я утирирую) — а значит на одну строчку кода в С++ приходиться больше информации, чем в С. А значит он на некую абстрактную производную от этой информации сложней.
Это безусловно довольно субъективный подход — но согласитесь, у разных людей разные вкусы. Кому то нравиться одно, кому то другое. Поэтому людям которые предпочитают чистый Си с вами согласиться тяжело — для них меньше кода отнюдь не значит безопасней и стопроцентно не значит легче.
Ну и насчет безопастности — все таки это больше зависит от опыта. Я вот в коде допустил такую дуратскую ошибку, а в реальном коде как в Enter/Leave оборачиваются очень небольшие участки, внутри которых нет переходов за них. И участки эти в голове прокручиваю. А тут просто набросал как пример и даже не задумался, будет работать или нет. Хотя я склонен думать, что программист с малым опытом на С++ допустит меньше ошибок чем на С. Но только если будет следовать RAII, а не писать legacy. Но понимание всей прелести RAII приходит только с опытом.
AS>>а давай дополним это до работающего кода?! P>только сначала скажи зачем, и приведи аналог на C. Я ведь изначально просил псевдокод.
Зачем приводить рабочий код? Ну я даже как то в растерянности. Объяснять столь очевидные вещи человеку с претензиями... Ты меня чеслово удивляешь.
Свой аналог я уже привёл. Как на С сделать обработку синхронизации, если ты про это, есть у меня в избранном, там довольно подробно всё разжованно. Сам же я давно уже не пишу многопоточный код, только асинхронный.
AS>>Как бы для того шоб горить про простоту и лёгкость, неплохо бы для начала пройти хотя бы по некоторым хитро замаскированным граблям. P>говори конкретно про грабли, не томи... P>диалог с тобой совсем не конструктивный получается, и утомляет [зевок]
О неее, я не благотворительная организация помогающая слабоумным. Не видишь, ну что же, это твои проблемы ))) Просто так и запишем, клиент знает С++ из букваря. Для тех кто знает чуть больше это будет самоочевидно, остальные значения не имеют. Могу лишь добавить что С++ язык множества тонких нюансов, если ты их не чувствуешь, ты можешь хоть наизусть заучить стандарт, страуса, саттера, меерса, александреску ... и всё равно писать хреновые программы.
А относительно конструктива — кто сказал что мне нужен конструктив? Я сюда потроллить прихожу, постебаться.
Здравствуйте, Alexéy Sudachén, Вы писали:
AS>>>Мне из какого файла STL привести кусок кода в качестве примера? ИМХО из любого. Я уж не говорю про силиконовый (или какой другой) протез, без которого писать на плюсах по человечески невозможно.
NB>>А что конкретно в реализации СТЛ вызывает затруднения?
AS>Найти людей которые могут не только читать код, активно его пользующий, но и как то его менять. Причём желательно за адекватные деньги. AS>Основная проблема С++ в том, что сопровождение кода стоит дороже его написания, и требует квалификации существенно выше чем у того, кто его писал. Такая вот парадоксальная зависимость. При условии же что чем программер лучше, тем меньше он хочет сопровождать чужой код... очевидно неинтересная.
AS>От собственно это в реализации STL у меня и вызывает затруднения.
ты несколько сгущаешь краски.
думаю, то же самое можно сказать и про твой код.
тут проблема не в шаблонах или макросах, а в программистах.
AS>Это всё к тому, что те кто упорно твердят — на С закат солнца делается сугубо только руками, несколько заблуждаются. Как и те кто убеждены что C++ всё сделает за них и бесплатно.
если не хочешь за удобство платить в рантайме, то именно что руками как бы не хотелось обратного.
и дело не только в исключениях.
у тебя, допустим, наследование используется? делать касты к базе приходится?
AS>Однако если тебе нужно точно знать кто кому сливает, дык возьми да проверь ))) Делов то.
ну, то есть тебя этот вопрос не сильно интересует? пинятно.
AS>>Причём никакой скрытой логики я в общем-то не добавил. E>Ну логики не добавил, а запутанности добавил... Это большой шаг в сторону write-only плюсов от сурового, но справедливого С! бойся, комрад! Программисты уже один раз ошиблись, отойдя от православного FORTRAN в сторону всяких богомерзких MODULA, PASCAL и С... Не повторяй ошибок прошлого! Стойко держись С! И выкини все эти макросы, они делают из твоего С жалкое подобие С++. Истина состоит в том, что автоматический RAII не нужен, а не в том, что путём кучи трюков его можно воспроизвести в С1
Аминь, камрад.
AS>>С++ же такое сделать в принципе невозможно, в силу концепции языка, а если бы и можно было это пошло бы в разрез с Единственным Истинно Верным Способом Программировать. ))) E>Тут ты не прав. Как учит самый главный страус-гуру, С++ -- он мультипарадигменный, там нет единственно-верного способа. Это один из его недостатков. Менеджер проекта должен ещё и парадигму выбрать, и как-то отследить, что кодеры ей следуют
Ну дык, да. У языка нет единственно верного способа, а у каждого, кто его пользует не сильно много лет, точно есть. )))
Вопрос не в принципиальной возможности, а в цене разработки. Иногда цена столь велика, что является запретительной...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, 11molniev, Вы писали:
1>Позволю себе частично с вами не согласиться, все достаточно сильно зависит от решаемых задач. Бесспорно, грамотный код на С++, при реализации дублирующихся функций будет компактней, безопасней и во всех остальных отношениях (кроме, возможно сложности) лучше. Но если функциональность не дублируется или дублируется с мелкими изменениями, выходит, что приплюснутого кода получается больше, иногда ещё и с ущербом для скорости и читабельности.
Не понимаю, в чём тут отличие С и С++ даже, а не С и С-подобного подмножества С++
Мне так кажется, что у всех сторонников С в голове всё время сидят С++-темплейты. А их можно вообще не использовать, ну или использовать очень очень ограниченно, там где они реально рулят и дают огромные преимущества, например...
С++ намного больше, чем шаблоны и ООП. Там ещё есть строгая типизация, перегруженные функции, тип CComplex, можно написать нормальную строчку или класс данных, содержащий изображения, например, и т. д...
Опять же RAII и исключения всякие могут рассматриваться...
То есть есть некоторый даже не "С с классами", а "С с классами, но не с объектами". И он вроде как таки лучше С, при этом он позволяет писать всё то же, что и на С, и в общем-то так же, только проще, безопаснее, выразительнее и т. д...
Плохо, что мало есть средств автоматического ограничения С++ таким образом.
Я бы, например, как менеджер, хотел бы иметь в С++ проекте какой-то профиль, в котором было бы размечено, чего из зыка можно юзать, а чего нет. И на выход в каком-то куске кода в продакшен-сборке, требовалась бы цыфровая подпись куска каким-то начальником или экспертом...
Но такого рода инструментов в С++ вообще нет...
1>Если уж совсем грубо, то плюсы можно сравнить с архиватором — сжатие (улучшение параметров) зависит от контента и результат может оказаться больше оригинала (при этом ещё и время на распаковку будет тратиться).
Ну так это только при бездумном использовании инструмента. Причём любого. В микроскоп прекрасно видно бактерии, но орехи им колоть неудобно, а соседское окно, так и вовсе не видно...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, Erop, Вы писали:
P>>а на счёт скорости разработки — сколько времени этот средний программист C убьёт на отладку? E>Не факт, что больше, чем С++... E>У С-шника будет больше строчек, зато ошибки все будут простые, а у С++ника строчек булет меньше, зато ошибки будут заковыристее...
у C-шника будут и простые ошибки, и заковыристые. У C++ника простые ошибки поймает компилятор (при правильном использовании C++).
хотите верьте, хотите нет, имхо таким абстрактным спором мы не убедим друг друга..
думаете на C будут только простые ошибки — ну ваше право
P>>а как вы выразите бизнес логику без абстракций? Как на C, вы выразите сложение двух разряженный матриц? E>AddBlaBlaBlaMatrix( &matrix1, &matrix2 );
ну вот и я о том же — ну очень выразительно.
а теперь сложите три матрицы, умножьте на четвёртую, потом на вектор. да причём так, чтобы сложение трёх матриц было эффективным, не (первая + вторая)+третья, а именно одновременно.
на C++ можно делать так:
(m1+m2+m3)*m4*v1,
а что будет на C?
P>>А как вы делаете большие и средние проекты, если без абстракций? Каждый уровень абстракции увеличивает на порядок то, что можно выразить E>С уровням абстракции вроде как не мешает... Вообще, уровни абстракции -- это скорее к голове архитектора, а не к языку...
да, но в C++ больше средств выражения абстракций
и при этом они:
3. абстракции (зачастую абсолютно ничего не стоящие)
Здравствуйте, Erop, Вы писали:
P>>точно такой же баг возможен и без duck-typing — например есть интерфейс с методом copy, и есть класс который реализует этот copy как move, либо вообще как remove. E>Это легко формально проверяется и требуется.
как именно?
как проверишь то, что этот метод copy не отформатирует диск?
P>>duck-typing не причём E>Наверное, а шаблоны С++ при чём...
Здравствуйте, Erop, Вы писали:
P>>что конкретно нужно исправить? P>>заменить все копирования auto_ptr на move unique_ptr ? E>Тут конкретно, ничего менять не надо. Это валидный код. E>Но если у меня есть шаблон karusel<T>, который таки ждёт от T нормальной копируемости, но программист этого явно не выразил, так как не знал как выразить и не имел никакого инструмента заметить, чо ему это свойство надо, так вот, надо выявит, что karusel<auto_ptr<ZZZ>> -- ошибка...
заменяешь auto_ptr на unique_ptr — и смотришь что поломалось
P>>есть STL. А есть C++ Standard Library E>Это какая-то лингвистическая магия. Типа "Стандартная Библиотека Шаблонов" или "Стандартный библиотечный шаблон"...
нет
P>>потребовать или проверить? E>Ну вот я написал шаблон какой-то. E>Теперь мне хорошо бы как-то получить список свойств, которые я от своего аргумента требую + как-то проверить все используемые аргументы, на наличие этих свойств. E>Ещё бы не кисло было бы заявить требования этих свойств явно, что бы программист сразу же и не пытался бы...
ЗP>>>>>нет, хотя бы потому, что std::auto_ptr это не STL P>>>В STL — нет auto_ptr. http://en.wikipedia.org/wiki/Standard_Template_Library E>>Что говорил там Степанов, или что в вики кто пишет -- это всё интересно в смысле биографии этих персон. Но у С++ есть стандарт, как бы...
ИМХО, что там Cтепанов говорил, сугубо ортогонально всем тем кто пишет на реальном C++, а не на словах Степанова. В референс реализации HP/SGI, которую все в том или ином виде передрали — auto_ptr есть.
P>ну а где в стандарте написано что autp_ptr относится к STL ???
В стандарте ISO/IEC 14882 в разделе 20.4.5 Class template auto_ptr. STL же в стандарте вообще нигде не упоминается. Собственно STL к С++ имеет ровно то же отношение что и MFC. Однако для простоты STL ака Standard Template Library приравнивается к стандартной библиотеке C++. Что как бы очевидно.
Ну, то есть ты мне хочешь доказать, что в коде, который я перерыл вдоль и поперёк, чего-то нет? И нет именно потому как это не перечислено на какой-то страничке? Будь мужчиной, открой сырки да посмотри. Смотреть надо в файл memory http://www.sgi.com/tech/stl/memory.
P>>>ну а где в стандарте написано что autp_ptr относится к STL ??? AS>>В стандарте ISO/IEC 14882 в разделе 20.4.5 Class template auto_ptr. STL же в стандарте вообще нигде не упоминается. Собственно STL к С++ имеет ровно то же отношение что и MFC. P>и какой из этого вывод?? то что auto_ptr есть в STL ?
Здравствуйте, Alexéy Sudachén, Вы писали:
AS>Ну, то есть ты мне хочешь доказать, что в коде, который я перерыл вдоль и поперёк, чего-то нет? И нет именно потому как это не перечислено на какой-то страничке? Будь мужчиной, открой сырки да посмотри. Смотреть надо в файл memory http://www.sgi.com/tech/stl/memory.
и строки там есть http://www.sgi.com/tech/stl/string .
но главный автор STL — Степанов говорит что в STL нет строк — кому верить?
P>>>>ну а где в стандарте написано что autp_ptr относится к STL ??? AS>>>В стандарте ISO/IEC 14882 в разделе 20.4.5 Class template auto_ptr. STL же в стандарте вообще нигде не упоминается. Собственно STL к С++ имеет ровно то же отношение что и MFC. P>>и какой из этого вывод?? то что auto_ptr есть в STL ? AS>Что auto_ptr есть в стандарте.
AS>>Ну, то есть ты мне хочешь доказать, что в коде, который я перерыл вдоль и поперёк, чего-то нет? И нет именно потому как это не перечислено на какой-то страничке? Будь мужчиной, открой сырки да посмотри. Смотреть надо в файл memory http://www.sgi.com/tech/stl/memory.
P>и строки там есть http://www.sgi.com/tech/stl/string . P>но главный автор STL — Степанов говорит что в STL нет строк — кому верить?
Верить сыркам — они истина. Да и кому какое дело до того что говорит Степанов?
Здравствуйте, Piko, Вы писали:
P>и какой из этого вывод?? то что auto_ptr есть в STL ?
Вывод просто. Есть ли auto_ptr в STL зависит от того, как в этой аббривиатуре расшифровывается первая буква. Если, как "степанов", то есть, но наличие не афишируется, а если как "стандартная", то есть и наличие гарантируется стандартом...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, Alexey Sudachen, Вы писали:
AS>Вот вам как пример одного из аспектов (а их много...), кошмарный сон — представьте себе что вы такой крутой С++ программер, ну скажем, один такой крутой на целый на город. Александреску там вкуриваете с полпинка, на шаблонах не материтесь, а прямо таки излагаете. И в коде у вас прямо таки полный фашизм контроль и порядок, все байты по струнке ходють. Круто да? И вдруг вам нужно часть своей работы делегировать кому-то ещё... упс, да?
Представьте что вы такой крутой С программер, ну скажем, один такой крутой на целый на город. Суровая рукопашка на макросах для имитации автоматики, goto out; goto cleanup; goto error; и т.п.
Круто да? И вдруг вам нужно часть своей работы делегировать кому-то ещё... упс, да?
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
Здравствуйте, Alexey Sudachen, Вы писали:
AS>Если вы сможете компилировать свой C код C++ компилятором, то вам просто кажется что вы пишете на С, но на самом деле лишь на подмножестве С++.
Это позволит там где нужно заюзать удобную фичу из С++ а не имитировать оргазм её на макросах.
AS>Ну и самое важное, человек будет писать на кастрированном С++
И что с того?
AS>вместо решения задачи, будет решаться задача как это правильно сделать на С++.
Ты путаешь тёплое с мягким. Это верно в обратную сторону — это на С приходится изгаляться чтоб сделать то, что есть в С++.
AS> Иначе говоря люди будут вместо работы заниматься синтаксическим онанизмом.
Мда. У нас уже был Андрей "Синтаксический Оверхед" Губанов, теперь похоже добавился Alexey "Синтаксический Онанизм" Sudachen.
AS>ИМХО, но страус просто неАсилил научится писать на С )))
ИМХО, но ты просто неАсилил научиться писать на С++ )))
AS>Я сюда не для просвещения страждущих хожу, мне сие с некоторого момента сугубо фиолетово, но троллинга и флуда ради. Короче, поразвлекаться.
Ради троллинга вали к троллям в КСВ.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
Здравствуйте, 11molniev, Вы писали:
1>К моей радости, большая часть аудитории данного форума это понимают.
Аж 27 человек! Большая часть, ага!
Ответ на этот вопрос даст тебе профайлер, но не голосования, в которых далеко не все вообще участвуют.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
Здравствуйте, 11molniev, Вы писали:
P>>вы хотели подтвердить моё высказывание своим опросом? 1>Что 2/3 посетителей этого форума с вами совсем не согласны.
2/3 из тех, кому не лень было сунуться в это голосование.
Ни о чём, в итоге.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
P>И получаем, что std::auto_ptr не валиден. Грустно плачем и несём С++/STL на помоечку?
P>о чём спорить? если косяк в auto_ptr — для тебя это повод нести C++/stdlib на помоечку
Ты тут рассказывал, как надёжно всё можно в С++ выявить и проверить.
Я показал тебе, что твой тест не пройдёт уже стандартная библиотека С++, так что что-то надо на омоечку, либо тест, либо С++ и его стандартную библиотеку
Предложение нести на помоечку не тест, а язык было сарказмом
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, Erop, Вы писали:
E>Тут вы оба не правы, IMHO. КМК это вообще свойство программиста, а не языка -- изгаляться над формой, вместо того, что бы пилить суть
Скажи, на чём придётся больше внимания уделять "сервисной обвязке": на языке, в котором есть автоматизация рутинных действий и на языке, в котором её нет?
E>У большинства это от недостатка опыта, и постепенно проходит, но у некоторых не проходит никогда...
Оставь этот менторский тон. Он не действует как ты рассчитываешь.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
Здравствуйте, Erop, Вы писали:
CC>>Представьте что вы такой крутой С программер, ну скажем, один такой крутой на целый на город. Суровая рукопашка на макросах для имитации автоматики, goto out; goto cleanup; goto error; и т.п. E>Суть тут в том, что крутой С-программер рукопашкой на макросах страдает только если ОЧЕНЬ надо
Судя по С коду разнообразных проектов, это самое "ОЧЕНЬ надо" случается очень часто. В общем то оно и понятно, не вручную же это всё каждый раз колбасить.
E> а goto cleanup -- стандартный приём в С, примерно такой же стандартный, как RAII в С++
Я ведь не говорю что это пц как плохо. Альтернативы в С очень мало, и goto не самый плохой вариант.
CC>>Круто да? И вдруг вам нужно часть своей работы делегировать кому-то ещё... упс, да? E>Ну, если проект нормально написан, то делигируешь без проблем.
Если ты не заметил, то мой пост практически цитата того, на что я отвечаю. Это было сделано специально чтоб показать оппоненту на нелепость категоричности его заявлений.
E> Впрочем как и на С++, только если он тоже НОРМАЛЬНО написан, а не как локи с STL...
Вооот! Ты начал подходить к правильному ответу: нормально написанный проект делегируется и поддерживается без проблем, вне зависимости написан он на С или на С++.
А вот защищаемый тобой товарищ этого понимать не желает.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
CC>Представьте что вы такой крутой С программер, ну скажем, один такой крутой на целый на город. Суровая рукопашка на макросах для имитации автоматики, goto out; goto cleanup; goto error; и т.п. CC>Круто да? И вдруг вам нужно часть своей работы делегировать кому-то ещё... упс, да?
Нет не упс.
Если вы за своим страхом шаблонов не заметили, что я как раз таки использую подход без этих симпатичных goto... (а не их имитации), это опять же показатель. Собственно, с той же серии, что и заблуждения про RAII, и фантазии про единственно верную и всё включающую модель ОО в С++. Однако, учить я никого здесь не собираю, как и доказывать что бы то ни было. Зачем? ))) Я сюда прихожу 'палочкой потыкать'.
Тем не менее, вы упускаете один маленький, но важный момент. С — язык активно используемый в вузах. В любом известном мне вузе, где готовят программеров, С читается как ключевой элемент программы и на нём выполняется довольно много заданий. С++ — как спецкурс, и в поверхностно. С не требует много времени, C++ же требует минимум два-три года практики для уверенного владения основным ядром конструкций, и пять лет для свободного владения языком. Хотите поспорить про годы практики на С++?
Фактически, студента ещё помнящего алгоритмику и прошедшего курс C вполне можно кидать на освоение предметной области. В случае c++ человек будет вместо работы несколько лет воевать с языком, а затем уйдёт в другую компанию как продвинутый С++ чувак. ))
Здравствуйте, Alexey Sudachen, Вы писали:
AS>В полоске над сообщением есть иконка такая с бомбочкой ) кликаешь и выбираешь — послать в КСВ. И усё.
Говны за тобой прибирать интересу нет. Может ты лучше сам туда писать начнёшь?
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
AS>>Я сюда прихожу 'палочкой потыкать'. CC>Ещё раз, ходи тыкать палочкой в специально отведённое место.
С чего бы это вдруг? Правил я не нарушаю и обсуждаю совершенно бессмысленную тему в совершенно адекватном тоне. Я знаю что все пользователи как бы равны, но вы, простите, что ровнее меня, что бы указывать куда мне пойти? У меня между прочим есть мнение, и я его высказываю.
AS>>Тем не менее, вы упускаете один маленький, но важный момент. С — язык активно используемый в вузах. В любом известном мне вузе, где готовят программеров, С читается как ключевой элемент программы и на нём выполняется довольно много заданий. С++ — как спецкурс CC>Тем хуже для этих вузов.
Дык, хто ж спорит. Хуже для вузов, хуже для компаний, хуже для рынка... Как несправедлива жизнь однако.
Здравствуйте, Erop, Вы писали:
E>>>Тут вы оба не правы, IMHO. КМК это вообще свойство программиста, а не языка -- изгаляться над формой, вместо того, что бы пилить суть CC>>Скажи, на чём придётся больше внимания уделять "сервисной обвязке": на языке, в котором есть автоматизация рутинных действий и на языке, в котором её нет? E>В нормальных программах это всё составляет не очень большую часть трудозатрат, так что пофиг на самом деле.
В нормальных это в каких? По мне так эта часть достаточно крупная чтоб заколебать через некоторое время. Всё то, что на плюсах делается контейнерами, RAII и прочими простыми упрощениями жизни тут приходится колбасить вручную каждый раз. Или делать на макросах, отлаживать которые потом то ещё развлечение.
E>>>У большинства это от недостатка опыта, и постепенно проходит, но у некоторых не проходит никогда... CC>>Оставь этот менторский тон. Он не действует как ты рассчитываешь. E>Я думаю, что он злит коллег, которые обсуждают персоны, а не идеи...
Значит он способствует скатыванию темы в простой срач.
Тем более оставь.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
AS>>Ну тогда давайте перестанем рассмативать std::sort как пример, и больше не будет упоминать? ОК?!
P>ок, но сначала ответь, желательно с аргументами: qsort vs std::sort P>1. что быстрее P>2. что надёжней P>3. что безопасней P>4. что более абстрактно P>?
Здравствуйте, Alexéy Sudachén, Вы писали:
AS>>>Ну тогда давайте перестанем рассмативать std::sort как пример, и больше не будет упоминать? ОК?! P>>ок, но сначала ответь, желательно с аргументами: qsort vs std::sort P>>1. что быстрее P>>2. что надёжней P>>3. что безопасней P>>4. что более абстрактно P>>? AS>Java.
AS>>>>Ну тогда давайте перестанем рассмативать std::sort как пример, и больше не будет упоминать? ОК?! P>>>ок, но сначала ответь, желательно с аргументами: qsort vs std::sort P>>>1. что быстрее P>>>2. что надёжней P>>>3. что безопасней P>>>4. что более абстрактно P>>>? AS>>Java.
P>ну то есть я понял, нажимаю на кнопку бачка..
Да хоть вентитль. С++ настолько же надёжен и безопасен как и ассемблер. Это факт установленный эмперически, просто существуют разные мифы что путём некоторых заклинаний можно сделать код абстрактно надёжно-безопасным. От только корка, как истина в последней инстанции, показыает что это именно что миф.
Абстрактность вообще в статическую типизацию не то чтобы плохо лжится, но весьма с трудом запихивается. )))
Здравствуйте, CreatorCray, Вы писали:
CC>В нормальных это в каких? По мне так эта часть достаточно крупная чтоб заколебать через некоторое время. Всё то, что на плюсах делается контейнерами, RAII и прочими простыми упрощениями жизни тут приходится колбасить вручную каждый раз. Или делать на макросах, отлаживать которые потом то ещё развлечение.
А и не надо на макросах. Надо честно писать. а то что работа вообще штука тяжёлая -- ну так тут никто не спорит.
Мало того, ты сейчас написал, только другими словами, что на С++ прогать более ПРИКОЛЬНО, чем на С. Так это и не оспаривается. Просто, насколько я понимаю, есть идея, что когда прогать прикольно, прогеры склонны раздувать код, а когда неприкольно -- склонны сокращать...
E>>>>У большинства это от недостатка опыта, и постепенно проходит, но у некоторых не проходит никогда... CC>>>Оставь этот менторский тон. Он не действует как ты рассчитываешь.
ПО существу, тем не менее, ты со мной согласился...
E>>Я думаю, что он злит коллег, которые обсуждают персоны, а не идеи... CC>Значит он способствует скатыванию темы в простой срач. CC>Тем более оставь.
Месье имеет власть мне приказывать?..
тогда предъявите звезду, мой шериф!
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, Erop, Вы писали:
P>>ок, но сначала ответь, желательно с аргументами: qsort vs std::sort P>>1. что быстрее E>Зависит от задачи и от программиста
в каких случаях qsort, по твоему мнению, быстрее?
P>>2. что надёжней E>Зависит от задачи и от программиста
в каких случаях qsort, по твоему, мнению надёжней?
P>>3. что безопасней E>Зависит от задачи и от программиста
в каких случаях qsort, по твоему, мнению безопасней?
Здравствуйте, Erop, Вы писали:
CC>>В нормальных это в каких? По мне так эта часть достаточно крупная чтоб заколебать через некоторое время. Всё то, что на плюсах делается контейнерами, RAII и прочими простыми упрощениями жизни тут приходится колбасить вручную каждый раз. Или делать на макросах, отлаживать которые потом то ещё развлечение. E>А и не надо на макросах. Надо честно писать. а то что работа вообще штука тяжёлая -- ну так тут никто не спорит.
Дык это получается почти копипаст. Что есть error prone и опять таки плохо поддерживаемо.
E>Мало того, ты сейчас написал, только другими словами, что на С++ прогать более ПРИКОЛЬНО, чем на С.
Более удобно. Мне достаточно написать один раз шаблонную обёртку, чтоб потом парой движений обеспечить схожий функционал в сотнях мест, где он нужен. На С для облегчения жизни у меня есть только макросы, у которых дофига ограничений и подводных камней.
E>Просто, насколько я понимаю, есть идея, что когда прогать прикольно, прогеры склонны раздувать код, а когда неприкольно -- склонны сокращать...
У меня таких идей нет. Да и идея мягко говоря странная. Мне когда "прикольно" хочется код написать максимально корректным (читай "без хаков"), простым и понятным. Когда "не прикольно" — абы скорее заработал как надо и забыть про него.
E>>>>>У большинства это от недостатка опыта, и постепенно проходит, но у некоторых не проходит никогда... CC>>>>Оставь этот менторский тон. Он не действует как ты рассчитываешь. E>ПО существу, тем не менее, ты со мной согласился...
Тебе похоже хочется выдать желаемое за действительное.
Говорю прямым текстом: я с тобой не согласен, и считаю что ты это написал троллинга ради.
E>>>Я думаю, что он злит коллег, которые обсуждают персоны, а не идеи... CC>>Значит он способствует скатыванию темы в простой срач. CC>>Тем более оставь. E>Месье имеет власть мне приказывать?
Советовать.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
Здравствуйте, Piko, Вы писали:
P>>>>>ок, но сначала ответь, желательно с аргументами: qsort vs std::sЗort P>>>>>1. что быстрее E>>>>Зависит от задачи и от программиста P>>>в каких случаях qsort, по твоему мнению, быстрее? AS>> X(const X &x) { for( int i=0; i < x.q_.size(); ++i ) q_.push_back(x.q_[i]); } AS>> qsort(&y[0],y.size(),sizeof(y[0]),(int(*)(const void*,const void*))X_sum_comp); P>шутник, UB'шник
добавляем
bool operator < (const X& a, const X &b){
return N_sum(a.q_) - N_sum(b.q_);
}
void swap(X &l,X &r){
swap(l.q_,r.q_);
}
Здравствуйте, Erop, Вы писали:
P>>в каких случаях qsort, по твоему мнению, быстрее? E>Слушайте, люди, вы меня правда пугаете. E>Ты сам не можешь написать пример в котором qsort порвёт std::sort? E>Хочешь совет? Напиши пример где функция сравнения ДОЛГАЯ. E>Например, у тебя есть массив неотрицательных чисел, E>чтобы сравнить два, ты от каждого вычисляешь exp( x / x_max ), с точностью 1 000 000 знаков, и потом в лексографическом с конца порядке сортируешь. Ну и чисел тысяч 10 хотя бы в массиве E>Вот, что бы лучше думалось, попробуй угадать, что вернёт функция RN_test:
class RandNum {
E>
у меня, например, возвращает 182%
идея зачётная но, к дискуссии имеет мало отношения
это уже разница самих алгоритмов(вытекающих из интерфейсов). с тем же успехом, можно имея только предикат less, реализовать через него компаратор для qsort.
с этой точки зрения пример не удачный, имхо очевидно
с тем же успехом можно взять хорошую реализацию qsort, и плохую sort, эта тема уже обсуждалась в начале топика
P>>в каких случаях qsort, по твоему, мнению надёжней? E>По моему мнению для всех. Ещё надёжнее, будет если её немножко шаблонно обернуть, но даже в чистом С-варианте она неверно работает только если передать не так буфер или напутать с типами.
ога, или с размером массива, или с размерам типа ...
E>Ещё надёжнее, будет если её немножко шаблонно обернуть
то есть ты согласен, что на C++ она была бы надёжней?
E>В std::sort способов накрячится есть просто невообразимое множество
не хочу опять начинать с тобой спорить на эту тему (ты же про duck-typing, отсутствие концепций и т.п.?).
но, вопрос: где по-твоему мнению программисты ошибаются чаще? с qsort или sort?
не количество возможных путей и бла-бла, а именно на практике что надёжней.
P>>>>3. что безопасней E>>>Зависит от задачи и от программиста P>>в каких случаях qsort, по твоему, мнению безопасней? E>А что значит "безопаснее"? Какая модель угроз?
Здравствуйте, Erop, Вы писали:
E>Если второе, то это очень неплохая иллюстрация, что С++ код и подхд к программированию СКРЫВАЕТ ОТ ПРОГРАММИСТА СУТЬ ДЕЛА, и это его главный и основной недостаток...
ипать, вот это выводы: в одном случае компаратор tristate — в другом обычный предикат, и ты из этого делаешь вывод, что С++ код и подхд к программированию СКРЫВАЕТ ОТ ПРОГРАММИСТА СУТЬ ДЕЛА
E>2) Про плохую и хорошую реализацию. Мы таки несём STL на помоечку или как? И то и то стандартные средства своих языков, а не поделки криворуких тенденциозных тестеров, вообще-то.
в стандартных use-case'ах sort рвёт qsort
далее, в своём же примере попробуй stable_sort
E>И авторы стандарта С++ и STL, и самого std::sort конечно же понимали, что они пессимизируют свой код примерно в два раза,
бред.
180% — это на каком компиляторе, и в каком режиме? не debug ли случайно?
и сколько выдаёт stable_sort???
E>по сравнению с С, но при этом они вынужденно пошли на это, стыдливо прикрывшись подстановкой функций обмена и сравнения E>Как ты думаешь, зачем std::sort в STL cделан тормозом?
маразм
P>>ога, или с размером массива, или с размерам типа ... E>Ну надо контролировать тип, это можно поручить статическому анализатору или макросу, а в С++ ещё и простому шаблону-обёртке.
макрос для контроля типа компаратора в студию. (либо поручение статическому анализатору)
E>>>Ещё надёжнее, будет если её немножко шаблонно обернуть P>>то есть ты согласен, что на C++ она была бы надёжней? E>Нет не согласен. На С++ писали бы как на С++ и получили бы в конце std::sort
то есть на C++ нельзя сделать сортировку, которая сортирует только массивы, принимает только указатели на компараторы, и при этом более надёжную?
E>>>В std::sort способов накрячится есть просто невообразимое множество P>>не хочу опять начинать с тобой спорить на эту тему (ты же про duck-typing, отсутствие концепций и т.п.?). P>>но, вопрос: где по-твоему мнению программисты ошибаются чаще? с qsort или sort? P>>не количество возможных путей и бла-бла, а именно на практике что надёжней. E>Я не согласен с твоим определением надёжности, но я думаю, что в готовом оттестированном коде ошибки с std::sort остаются чаще, чем с qsort...
на выделенное ответишь?
E>Но тут надо учесть, что вызвать std::sort для vector<bool> я считаю ГРУБОЙ ошибкой. Но она на С++ скорее всего никогда не будет выявлена, если только случайно, в то время как на С ей вообще не удастся закодировать...
это не ошибка
сортировка отработает с заявленной сложностью. да, константа будет большой, но во-первых никто не запрещает
сделать специализацию для vector<bool>, никто не запрещает сделать сортировку, которая принимает только обычные массивы — и при этом будет лучше qsort
P>>тот же buffer overflow E>Очевидно, что неверные границы буфера можно передать в оба алгоритма...
я это и сказал:
в std::sort конечно тоже можно ошибиться с границей,
зачем ты меня повторяешь
но имхо — это намного реже происходит
комментарии будут?
E>Мало того, если в С-шный передают счётчик, что даёт надежду, что он будет сортировать не всю память, а посортирует какой-то кусок и расслабится, то в С++ный передают пару итераторов. Если они будут от разных массивов, то приятной вам отладки
проверка итераторов делается в debug моде, во многих реализациях из каропки
E>2) Про плохую и хорошую реализацию. Мы таки несём STL на помоечку или как? И то и то стандартные средства своих языков, а не поделки криворуких тенденциозных тестеров, вообще-то. И авторы стандарта С++ и STL, и самого std::sort конечно же понимали, что они пессимизируют свой код примерно в два раза, по сравнению с С, но при этом они вынужденно пошли на это, стыдливо прикрывшись подстановкой функций обмена и сравнения
ога, ога.
замени
RandNum() : body( rand() ) {}
на
RandNum() {static int cnt=100000000; body=cnt;--cnt;}
и сравни qsort, sort и stable_sort, раз уж мы об алгоритмах заговорили и об C++way
у stable_sort почти в три раз меньше вызовов предиката чем вызовов компаратора у qsort.
и что теперь?
я жду новых чудесных выводов с твоей стороны
AS>>>В С вот нет конструктора копирования и требований на exception-safe код, что бывает сильно раляет в сравнении. Если сортировать не целые числа ... то std::sort далеко не всегда так крут как хотелось бы некоторым.
P>>ээ... std::sort это лишь пример, что имхо очевидно. и дело тут вовсе не в алгоритме сортировки.
Ну, то есть ты не понимаешь что специфика конструкторов, операторов и ограничений на обработку исключений к алгоритму сортировки не относится, но влияет на скорость и валидность? И никакая 'типа надёжность' тебя не спасёт от тривиальной опечатки или забывчивости. Ровно так же как и в С. По корке же вся эта магия только усложнит поиск проблемы. Я тебе написал пример, и что? Всё что ты увидел это UB, которого в С, с которым мы сравниваем, просто нет. Увидел что можно дописать пару заклинаний... вот только самого примера ты не увидел.
Когда скорость и корректность работы строчки кода зависит от наличия/отсутствия в области видимости неких заклинаний... это нечто, да. )))
Здравствуйте, Piko, Вы писали:
P>я тебя поздравляю, _Debug_lt небось
Попробуй получить число меньше 100%
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, Erop, Вы писали:
E>Сначала я думал, что вы прикалываетесь, но когда я понял, что вы и правда не видите, что std::sort пессимизирован в угоду красоте и реюзабельности кода, я просто показал вам код и пример.
Здравствуйте, Piko, Вы писали:
P>то есть всё таки не 180%
Ты читаешь невнимательно. 182%...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Я это утверждение вообще не понимаю. Это примерно как сказать, что кубики всегда легче шариков, если кубики и шарики имеют одинаковую форму...
E>>Не могу не заметить, что это, конечно очень ценное свойство, но reverse вообще в компараторе на этих данных не нуждается и всё прекрасно сортирует
P>шутник
Ну так на тебя сморю и учусь...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
И теперь этот новый шаблон как ёжки тестируем
CC>Мы не обсуждаем конкретную реализацию std::sort. Мы обсуждаем подход: шаблонный код с вкомпиливаемым компаратором vs отдельный заранее скомпиленный код с функцией-компаратором.
Это понятно, что если функци подставится, то может быть немного быстрее, а если функция тривиальная, то и много.
Беда тут в том, что всё станет сложнее, std::map, std::set, для всяких типов, вроде int работать из коробки не будет, либо надо будет для них функцию сравнения приивинтить и т. д...
И так выходит на круг, что фиг бы с ней, с той эффективностью, главное реюзабельность
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, org_256, Вы писали:
_>MSVC2010 поддерживает С99? _>как переключать?
_>Что то после 7 летней практики Lcc и GCC не могу никак привыкнуть _>к С89-like требованию объявлять переменные до первого оператора
Здравствуйте, Ops, Вы писали:
Ops>Здравствуйте, org_256, Вы писали:
_>>MSVC2010 поддерживает С99? _>>как переключать?
_>>Что то после 7 летней практики Lcc и GCC не могу никак привыкнуть _>>к С89-like требованию объявлять переменные до первого оператора
Ops>http://connect.microsoft.com/VisualStudio/feedback/details/485416/support-c99
угу, так и понял... печалька... тогда попользь опять в DevCpp )))
Здравствуйте, org_256, Вы писали:
_>MSVC2010 поддерживает С99? _>как переключать?
_>Что то после 7 летней практики Lcc и GCC не могу никак привыкнуть _>к С89-like требованию объявлять переменные до первого оператора
Здравствуйте, coba, Вы писали:
C>Здравствуйте, org_256, Вы писали:
_>>MSVC2010 поддерживает С99? _>>как переключать?
_>>Что то после 7 летней практики Lcc и GCC не могу никак привыкнуть _>>к С89-like требованию объявлять переменные до первого оператора
C>http://herbsutter.com/2012/05/03/reader-qa-what-about-vc-and-c99/
о как! /TP заработало! спасибки!!! =)
Правда теперь на приведение к void* жалуется )))...
Здравствуйте, Ops, Вы писали:
Ops>Здравствуйте, org_256, Вы писали:
_>>о как! /TP заработало! спасибки!!! =) _>>Правда теперь на приведение к void* жалуется )))...
Ops>Так это в 11, заказчикам такое не отдашь...
Мои потребители получают только бинарник и интерфейсы...
А так, я сам себе режиссёр ))) игры шароварные )))
так значит /TP просто включает поддержку C++11??? (((
Здравствуйте, org_256, Вы писали:
_>Мои потребители получают только бинарник и интерфейсы... _>А так, я сам себе режиссёр ))) игры шароварные )))
Так все-таки бета, даже не RC, мало ли какой там код нагенерит, рантайм, опять же, протухнет скоро.
_>так значит /TP просто включает поддержку C++11??? (((
А с /TC как?
Переубедить Вас, к сожалению, мне не удастся, поэтому сразу перейду к оскорблениям.
Здравствуйте, org_256, Вы писали:
_>так значит /TP просто включает поддержку C++11??? (((
нет, /TP /TC это опции переключатели языка компиляции, подробнее здесь. Просто Сатер пишет, что стандарты все более совмещаются, и те кто хочет в будущем использовать фичи С смогут найти некоторые из них в новом стандарте С++, для этого они должны откомпилить исходники С как исходники С++.
Здравствуйте, coba, Вы писали:
C>Здравствуйте, org_256, Вы писали:
_>>так значит /TP просто включает поддержку C++11??? (((
C>нет, /TP /TC это опции переключатели языка компиляции, подробнее здесь. Просто Сатер пишет, что стандарты все более совмещаются, и те кто хочет в будущем использовать фичи С смогут найти некоторые из них в новом стандарте С++, для этого они должны откомпилить исходники С как исходники С++.
Здравствуйте, org_256, Вы писали:
_>((( Короче опять лажает MS ((( _>пойду таки в GCC
не лажает, просто у нет такой у неё цели, еще в момент появления С99 они открыто сказали, что цель поддерживать С99 перед собой не ставят, концентрируя своё внимание на С++.
Здравствуйте, org_256, Вы писали:
_>>>так значит /TP просто включает поддержку C++11??? ((( C>>нет, /TP /TC это опции переключатели языка компиляции, подробнее здесь. Просто Сатер пишет, что стандарты все более совмещаются, и те кто хочет в будущем использовать фичи С смогут найти некоторые из них в новом стандарте С++, для этого они должны откомпилить исходники С как исходники С++. _>((( Короче опять лажает MS ((( _>пойду таки в GCC
А зачем вообще может понадобится использовать C, когда есть C++ ?
Что мешает использовать то подмножество C++, которое комфортно вам? (я знаю что множество C не полностью входит в C++)
Единственный более-менее правдоподобный аргумент в пользу чистого C — отсутствие вменяемого C++ компилятора для нужной платформы. Да и то, давно уже есть компиляторы, преобразовывающие C++ код в C код.
Мне удобней С99, проекты небольшие, есть требования к компактности и переносимости.
Я ведь вопрос не ради холливара задавал? давайте каждый останется при своем мнении?
Здравствуйте, org_256, Вы писали:
P>>А зачем вообще может понадобится использовать C, когда есть C++ ? P>>http://www.youtube.com/watch?v=KlPC3O1DVcg _>Мне удобней С99, проекты небольшие, есть требования к компактности и переносимости. _>Я ведь вопрос не ради холливара задавал? давайте каждый останется при своем мнении?
Я вопрос задал не ради предубеждения или холивара.
Мне действительно интересно, где сейчас реально может понадобится чистый C, и не подойдёт использование C++ (какого-либо его подмножества).
Здравствуйте, ArtDenis, Вы писали:
AD>Здравствуйте, org_256, Вы писали:
_>>Только законченному идиоту придет в голову писать ОС, или упаси бог, ядро этой ОС на С++
AD>А какие проблемы при этом возникнут?
Здравствуйте, ArtDenis, Вы писали:
AD>Здравствуйте, org_256, Вы писали:
_>>Только законченному идиоту придет в голову писать ОС, или упаси бог, ядро этой ОС на С++
AD>А какие проблемы при этом возникнут?
Здравствуйте, ArtDenis, Вы писали:
AD>Здравствуйте, org_256, Вы писали:
_>>У идиота?
AD>Пускай даже у идиота. Так какие будут проблемы?
Обыкновенно, у идиотов не бывает проблем.
Коллега, объективного вы ничего НЕ УСЛЫШИТЕ!
А мое сугубо субъективное мнение, многократно подтверждаемое моим субъективным опытом,
вряд ли вам будет интересно...
Здравствуйте, org_256, Вы писали:
_>Речь не идет о "чистом Си", речь идет о его "осовремененном" диалекте — формально, о "стандарте" 99 года.
под "чистым C" я имел ввиду просто C, один из его стандартов (например C99). "не-чистый C" в данном контексте это подмножество C++.
_>Только законченному идиоту придет в голову писать ОС, или упаси бог, ядро этой ОС на С++, используя концепцию ООП, особенно в CLI нотации.
Вообще-то C++ это далеко не только ООП. Никто не заставляет раздувать иерархию классов в ядре.
И причём тут вообще CLI???
_>P.S. Я не отказываюсь от ООП, если вы это имели ввиду. Просто у нас с Б. Страуструпом разные точки зрения по этому поводу
И дальше там идёт пояснение.
_>Я успешно использую Си и С99 в двух "почти" своих проектах, ( не могу сказать каких, в виду подписанного мною NDA ). _>И в 80-90% случаев предпочитаю использовать С99 при создании игр
Здравствуйте, org_256, Вы писали:
_>А мое сугубо субъективное мнение, многократно подтверждаемое моим субъективным опытом, _>вряд ли вам будет интересно...
Его никто не знает. (без обид). Даже г-н Б. Страуструпп не знает.
Я знаю достаточно много языка С++ чтобы принимать решение, что мне не нужно использовать С++ в моих проектах.
Насчёт blub, не поленился таки, прочитал. Т.е. вы признаете, что раз вы так рьяно защищаете С++ то вы blub по отношению к Java, C#, или VB?
P.S. Опять же, боюсь повториться, но: Я не отказываюсь от ООП и всех исходящих плюшек.
Мне просто не нравится как "реализован" этот подход в С++.
Здравствуйте, ArtDenis, Вы писали:
AD>Здравствуйте, org_256, Вы писали:
_>>А мое сугубо субъективное мнение, многократно подтверждаемое моим субъективным опытом, _>>вряд ли вам будет интересно...
AD>Нет, нет. Мне очень интересно.
Тогда объясните, чего конкретно вы от меня желаете услышать???
P.S. там в видео, мнения не только Страуструпа
P>>это больше похоже на blub-программиста http://en.wikipedia.org/wiki/Paul_Graham_%28computer_programmer%29#Blub P>>скорей всего вы просто почти не знаете C++ (без обид). _>Его никто не знает. (без обид). Даже г-н Б. Страуструпп не знает.
Я не написал "вы не знаете", а написал "почти не знаете", это разные вещи.
_>Я знаю достаточно много языка С++ чтобы принимать решение, что мне не нужно использовать С++ в моих проектах. _>Насчёт blub, не поленился таки, прочитал. Т.е. вы признаете, что раз вы так рьяно защищаете С++ то вы blub по отношению к Java, C#, или VB?
Вы ушли куда-то не в ту степь. Я не защищаю C++, я пытаюсь понять, почему люди используют C, в тех случаях когда возможно использование подмножества C++, какие в этом преимущества. И если преимущества действительно есть (которые я сейчас не вижу), то я буду рассматривать C при выборе средства.
Причём вообще здесь все эти vm/managed языки, мы ведь говорим об Native code?
И даже если говорить про эти языки — я не говорил о них ничего, с чего вы взяли что я "blub по отношению" к ним?
_>P.S. Опять же, боюсь повториться, но: Я не отказываюсь от ООП и всех исходящих плюшек. _> Мне просто не нравится как "реализован" этот подход в С++.
А я вообще не говорил про ООП, вы начали про него. Исходя из того, что вы так много говорите про OOP, я и сделал вывод, что С++ вы почти не знаете. Так как C++ это далеко не OOP.
Здравствуйте, ArtDenis, Вы писали:
AD>Здравствуйте, org_256, Вы писали:
AD>>>Здравствуйте, org_256, Вы писали: _>>>>А мое сугубо субъективное мнение, многократно подтверждаемое моим субъективным опытом, _>>>>вряд ли вам будет интересно...
AD>>>Нет, нет. Мне очень интересно.
_>>Тогда объясните, чего конкретно вы от меня желаете услышать???
AD>Примеры из вашего субъективного опыта, подтверждающие ваше высказывание. Достаточно одного примера.
Какое именно высказывание? Хотелось бы побольше конкретики... ( Выделенное жирным вырвано из контекста )
Здравствуйте, org_256, Вы писали:
_>Вы ожидаете от меня услышать что то что можно оспорить. Я повторяю, ничего объективного, т.е. фактического, обусловленного объяснением за пределами конкретной личности ( индивида ), вы от меня не услышите, потому-что просто не захотите слушать. А мое субъективное мнение( т.е. мнение, сформировавшееся за счёт личного, субъективного опыта, характерного только для меня) вас вряд ли порадует. За сим не вижу смысла в вашем вопросе.
Ну вам же написали, что субъективное мнение тоже интересно:
" _>>А мое сугубо субъективное мнение, многократно подтверждаемое моим субъективным опытом, _>>вряд ли вам будет интересно... AD>Нет, нет. Мне очень интересно.
"
Вы можете просто привести своё субъективное мнение, если вам не хочется — спорить вас никто не заставляет.
Здравствуйте, ArtDenis, Вы писали:
AD>Здравствуйте, org_256, Вы писали:
_>>Если вы действительно просто желаете спорить, или убедить меня в чем-то ( подозреваю собака тут покопалась ), то боюсь к сожалению вам придется указать мне успешные конкурентноспособные ОС преимущественно ядро которых написано на С++... если таких нет, какой смысл дальше препираться?
AD>Я же написал: мне действительно интересен любой ваш опыт по этому вопросу. Я хочу не спорить и припираться. Я хочу послушать любые аргументы или случаи из личного опыта в пользу вашего высказывания, не смотря на то, что они будут даже не из области написания ядра ОС на С++.
1. Большую часть времени я пишу для платформы с большим ограничением по пространству-времени. ( робототехника )
2. При написании игр долгое время приходилось поддерживать огромное число "слабых" машин. ( и да! можете убить меня, я пишу на голом WinAPI )
3. C++ сам по себе ни плох ни хорош. Просто лично для себя я не нашел хороших аргументов, чтобы постоянно писать всё что ни попадя только на нём.
4. Я использую и С++ как вариант подмножества Си в нём, почти не загружая код архитектурными излишествами, но часто сталкивался с кривой реализацией, и не возможностью поддерживать "чистый" Си ( без серьёзного допила )...
5. В большинстве моих проектов и задач использование С++ равносильно "стрельбе из пушки по воробьям".
6. Если я сталкиваюсь с непреодолимой необходимостью использовать С++ для нового пректа, я пониманию, что проект формализован криво и пробую перестроить его. Потому-что твёрдо уверен, что нет такой задачи, которую можно реализовать только на С++ ( я в адеквате, аргументы типа на С++ писать быстрей и проще тут не вариант )...
7. Если бы все мои задачи требовали быстрого решения и реализации и не были бы требовательны к скорости выполнения и размерам кода, то да, я бы стал использовать С++ постоянно, даже не смотря на то, что этот язык просто чисто физически не возможно выучить на все 100%.
8. Аргументы вроде: на современных машинах вызов через один указатель или через указатель на на таблицу указателей не имеет значения, потому что скорость на современных машинах ничтожна мала и не ощутима даже в супер-пупер-тестах... — для меня не аргумент...
9. Аргументы вроде: На Си глобалы, код-лапша, легко насрать куда не нужно, что провоцирует трудновылавливаемые баги — тоже не аргументы. Баги есть даже в релизном коде многих успешных продуктов.
10. Аргументны типа: можно писать Cи-like коде в самом C++ — тоже не аргумент, довелось работать в таких проектах. Половина кода на кривом С++, половина на Си, большая часть кода — вообще сторонние библиотеки на С++ со своей, невообразимой семантикой. В результате куча костылей, граблей и прочей фигни.
11. Я пишу свой код один, все мои "заказчики" — конечные потребители, поддержка моего кода ведётся только мной. Код небольшой, сложность в пределах постигаемости в одно лицо.
12. Вся RMOS ( моя система для экспериментальных роботов-манипуляторов ) написана на С99. Далее LCC->AT89C51. ( лицензия есть ).
Здравствуйте, org_256, Вы писали:
_>1. Большую часть времени я пишу для платформы с большим ограничением по пространству-времени. ( робототехника ) _>...
Вообще я ожидал услышать что-то типа "В случае <бла-бла-бла> был применён С++, но от него пришлось отказаться по причине <бла-бла-бла>. Код бы переписан на си, что привело к повышению <бла-бла-бла>", а получил кучу демагогии, из которой ничего не следует. Пичалька
Здравствуйте, ArtDenis, Вы писали:
AD>Здравствуйте, org_256, Вы писали:
_>>1. Большую часть времени я пишу для платформы с большим ограничением по пространству-времени. ( робототехника ) _>>...
AD>Вообще я ожидал услышать что-то типа "В случае <бла-бла-бла> был применён С++, но от него пришлось отказаться по причине <бла-бла-бла>. Код бы переписан на си, что привело к повышению <бла-бла-бла>", а получил кучу демагогии, из которой ничего не следует. Пичалька
И вообще, каким нужно быть идиотом, чтобы создав проект, и на опираясь С++, вдруг, резко ни с того ни с сего решить даунсемплиться в Си?
Когда я создаю проект я НЕ сразу принимаю решение, а решительно обдумываю всё.
И только после тщательного анализа ситуации выбираю то или иное средство.
Просто чаще всего С99 хватает за глаза. В "стопиццотый" раз повторяю:
у меня крохотнюсенькие проекты. использование С++ в них неоправданная роскошь.
Здравствуйте, org_256, Вы писали:
_>1. Большую часть времени я пишу для платформы с большим ограничением по пространству-времени. ( робототехника )
Это распространённое заблуждение, что код на C более быстр и менее требователен. Если важна эффективность, C++ легко позволяет писать более оптимальные программы чем C.
_>2. При написании игр долгое время приходилось поддерживать огромное число "слабых" машин. ( и да! можете убить меня, я пишу на голом WinAPI )
см. ответ на пункт 1.
_>3. C++ сам по себе ни плох ни хорош. Просто лично для себя я не нашел хороших аргументов, чтобы постоянно писать всё что ни попадя только на нём.
попробуйте изучить C++
_>4. Я использую и С++ как вариант подмножества Си в нём, почти не загружая код архитектурными излишествами, но часто сталкивался с кривой реализацией, и не возможностью поддерживать "чистый" Си ( без серьёзного допила )...
Очень интересно услышать примеры. И особенно дату(приблизительный год) этих примеров.
_>5. В большинстве моих проектов и задач использование С++ равносильно "стрельбе из пушки по воробьям".
Вы что-то путаете, C++ позволяет разрабатывать программы быстрее чем C, это касается даже мелких проектов.
_>6. Если я сталкиваюсь с непреодолимой необходимостью использовать С++ для нового пректа, я пониманию, что проект формализован криво и пробую перестроить его. Потому-что твёрдо уверен, что нет такой задачи, которую можно реализовать только на С++ ( я в адеквате, аргументы типа на С++ писать быстрей и проще тут не вариант )...
Выделенное — типичный аргумент (точнее не аргумент, а высказывание) blub-программиста.
Можно тоже самое сказать и про ассемблер, и даже про машину Тьюринга — на них можно реализовать любые задачи.
_>7. Если бы все мои задачи требовали быстрого решения и реализации и не были бы требовательны к скорости выполнения и размерам кода, то да, я бы стал использовать С++ постоянно, даже не смотря на то, что этот язык просто чисто физически не возможно выучить на все 100%.
даже выучив 50% C++, вы сможете делать более быстрые программы чем на C, либо более компактные чем на C (вообще одновременно максимальная компактность и максимальная скорость почти никогда не достигаются одновременно, в том числе и на C)
_>8. Аргументы вроде: на современных машинах вызов через один указатель или через указатель на на таблицу указателей не имеет значения, потому что скорость на современных машинах ничтожна мала и не ощутима даже в супер-пупер-тестах... — для меня не аргумент...
При чём тут вызов через указатель?
Там где необходимо сделать runtime decision в C++, его также необходимо сделать и в C.
Compile-time decision конечно быстрее чем runtime decision, но никто вас не заставляет делать runtime decision, где возможно compile-time. И кстати, C++ предоставляет намного более богатые возможности для реализации compile-time decision.
Ярким примером является сравнение std::sort (C++ style) vs qsort (C-style) — как вы думаете, что быстрее?
В std::sort как раз compile-time decision, а в qsort — runtime decision. http://www2.research.att.com/~bs/new_learning.pdf http://channel9.msdn.com/Events/GoingNative/GoingNative-2012/Keynote-Bjarne-Stroustrup-Cpp11-Style
_>9. Аргументы вроде: На Си глобалы, код-лапша, легко насрать куда не нужно, что провоцирует трудновылавливаемые баги — тоже не аргументы. Баги есть даже в релизном коде многих успешных продуктов.
какие-то детские рассуждения.
То что баги есть во многих успешных проектах, ни капли не аргумент против того, что C++ позволяет писать программы с меньшим количеством багов (а значит быстрее).
При грамотном использовании C++ позволяет находить многие баги при компиляции, либо не делать их вовсе (по сравнению с C). Да, все делают ошибки, но при грамотном использовании C++ позволяет делать меньше багов чем C.
_>10. Аргументны типа: можно писать Cи-like коде в самом C++ — тоже не аргумент, довелось работать в таких проектах. Половина кода на кривом С++, половина на Си, большая часть кода — вообще сторонние библиотеки на С++ со своей, невообразимой семантикой. В результате куча костылей, граблей и прочей фигни.
Говнокод существует и в C проектах, и в C++ проектах.
_>11. Я пишу свой код один, все мои "заказчики" — конечные потребители, поддержка моего кода ведётся только мной. Код небольшой, сложность в пределах постигаемости в одно лицо.
C++ позволило бы уменьшить сложность ваших проектов и делать их быстрее.
_>12. Вся RMOS ( моя система для экспериментальных роботов-манипуляторов ) написана на С99. Далее LCC->AT89C51. ( лицензия есть ).
Как я писал ранее — отсутствие компилятора действительно может затруднять использование С++, но как я уже писал есть компиляторы транслирующие код C++ в код C.
Здравствуйте, org_256, Вы писали:
_>И вообще, каким нужно быть идиотом, чтобы создав проект, и на опираясь С++, вдруг, резко ни с того ни с сего решить даунсемплиться в Си?
Есть очень много причин, которые могут заставить сменить язык разработки. Для RT это можеть быть, например, несоответствие времени оклика необходимым значениям. И только идиот будет упорствовать и писать на заранее проигрышном для данной ситуации языке, зная, что это приведёт к краху проекта. Не?
Здравствуйте, ArtDenis, Вы писали:
AD>Здравствуйте, org_256, Вы писали:
_>>И вообще, каким нужно быть идиотом, чтобы создав проект, и на опираясь С++, вдруг, резко ни с того ни с сего решить даунсемплиться в Си?
AD>Есть очень много причин, которые могут заставить сменить язык разработки. Для RT это можеть быть, например, несоответствие времени оклика необходимым значениям. И только идиот будет упорствовать и писать на заранее проигрышном для данной ситуации языке, зная, что это приведёт к краху проекта. Не?
Вы говорите то же что и я только другими словами... Где смысл?
Вы читаете мои ответы другим переписчичкам? подозреваю что нет....
Здравствуйте, org_256, Вы писали:
_>Если вы действительно просто желаете спорить, или убедить меня в чем-то ( подозреваю собака тут покопалась ), то боюсь к сожалению вам придется указать мне успешные конкурентноспособные ОС преимущественно ядро которых написано на С++... если таких нет, какой смысл дальше препираться?
scmrtos — собственно не ОС, а только шедулер. Можно рассматривать как ядро ОС.
Вполне себе конкурентносособная на 8-битниках и младших 32-битниках
Здравствуйте, Vamp, Вы писали:
P>>А зачем вообще может понадобится использовать C, когда есть C++ ? V>В С99 есть киллер фича — динамические массивы. Сразу, пока меня не ткнули в вектор — их можно создавать на стеке, и тогда они V>а. быстрее V>б. не приводят к фрагментации памяти.
в. выедают stack
V>Кроме того, С компилятор не делает манглинга — что очень важно, если пишешь бинарную библиотеку.
extern "C"
V>И наконец, сообщения об ошибках от С компилятора, как правило, в разы более вменяемые.
не сравнивал. недавно открыл для себя clang — улётная штука
V>В остальном для компиляции С кода можно использовать компилятор С++ — бинарник, который он будет делать, гарантированно не будет хуже, чем тот, который бы произвел С компилятор на том же самом исходнике.
V>>В С99 есть киллер фича — динамические массивы. V>>а. быстрее V>>б. не приводят к фрагментации памяти. P>в. выедают stack
Это не обязательно проблема — например, если такой массив используется в многократно вызываемой фунцкции. Стек все равно освобождается в ее конце.
Кстати, есть еще один пункт, про который я забыл — их можно использовать в обработчиках сигналов.
V>>Кроме того, С компилятор не делает манглинга — что очень важно, если пишешь бинарную библиотеку. P>extern "C"
Не помогает . Полностью манглинг это не убирает. Не пробовал что ли, никогда? Чтобы не было манглинга, надо колдовать с опциями компилятора (gcc) или сочинять .def файл (виндоус).
V>>И наконец, сообщения об ошибках от С компилятора, как правило, в разы более вменяемые. P>не сравнивал. недавно открыл для себя clang — улётная штука
Clang, говорят, крутой. Но в продакшн я не слышал, чтобы кто-то его использовал. А разница в диагностике выглядит примерно так:
int foo(int k) { return k; }
int main() {
double* p;
foo(); // missing parameter
p(); //calling something which is not a function
foo(p); // improper usagechar (*f)(int) = foo; // function mismatch
}
С++:
"test_error.cpp", line 5: Error: Too few arguments in call to "foo(int)".
"test_error.cpp", line 6: Error: Only a function may be called.
"test_error.cpp", line 7: Error: Formal argument k of type int in call to foo(int) is being passed double*.
"test_error.cpp", line 8: Error: Cannot use int(*)(int) to initialize char(*)(int).
С:
"test_error.c", line 5: prototype mismatch: 0 args passed, 1 expected
"test_error.c", line 6: function designator is not of function type
"test_error.c", line 7: warning: improper pointer/integer combination: arg #1
"test_error1.c", line 8: warning: assignment type mismatch:
pointer to function(int) returning char "=" pointer to function(int) returning int
Сравниваем:
Строка 5 — сишный компилятор четко говорит, сколько должно быть аргументов, и сколько передано. Плюсовый — просто ругается. Когда аргумент один, это не важно. А вот если их 10...
Строка 6. Плюсовый просто врет — не только функцию можно вызывать! Сишный четко говорит. Но вобщем-то, здесь ничья.
Строка 7. Компилятор подсказывает, какой именно аргумент не такой в твоем вызове, а не заставляет тебя лезть в объявление функции, чтобы смотреть, что там k. Особенно увлекательно при использовании всяких смешных имен с подчеркиваниями.
Строка 8. Ну тут и комментировать нечего.
V>>>В С99 есть киллер фича — динамические массивы. V>>>а. быстрее V>>>б. не приводят к фрагментации памяти. P>>в. выедают stack V>Это не обязательно проблема — например, если такой массив используется в многократно вызываемой фунцкции. Стек все равно освобождается в ее конце.
ну естественно — это же стэк.
проблемы могут начаться, при относительно большом количестве вложенных вызовов.
V>>>Кроме того, С компилятор не делает манглинга — что очень важно, если пишешь бинарную библиотеку. P>>extern "C" V>Не помогает . Полностью манглинг это не убирает. Не пробовал что ли, никогда? Чтобы не было манглинга, надо колдовать с опциями компилятора (gcc) или сочинять .def файл (виндоус).
естественно, что полностью не уберёт, так как в С++ есть перегрузка функций(для каждой должно быть своё имя) и т.п.
но ничто не мешает для С++ библиотеки, делать полностью clean-C интерфейс.
V>>>И наконец, сообщения об ошибках от С компилятора, как правило, в разы более вменяемые. P>>не сравнивал. недавно открыл для себя clang — улётная штука V>Clang, говорят, крутой. Но в продакшн я не слышал, чтобы кто-то его использовал.
Clang можно использовать только для диагностики, без поставки собраных им бинарников.
V>А разница в диагностике выглядит примерно так:
а что за компиляторы?
вот вывод clang (в консоли, он ещё раскрашивает сообщения)
C:
errt.c:5:9: error: too few arguments to function call, expected 1, have 0
foo(); // missing parameter
~~~ ^
errt.c:1:1: note: 'foo' declared here
int foo(int k) { return k; }
^
errt.c:6:6: error: called object type 'double *' is not a function or function pointer
p(); //calling something which is not a function
~^
errt.c:7:9: warning: incompatible pointer to integer conversion passing 'double *' to parameter of type 'int' [-Wint-conversion]
foo(p); // improper usage
^
errt.c:1:13: note: passing argument to parameter 'k' here
int foo(int k) { return k; }
^
errt.c:8:12: warning: incompatible pointer types initializing 'char (*)(int)' with an expression of type 'int (int)' [-Wincompatible-pointer-types]
char (*f)(int) = foo; // function mismatch
^ ~~~
2 warnings and 2 errors generated.
C++
errt.cpp:5:5: error: no matching function for call to 'foo'
foo(); // missing parameter
^~~
errt.cpp:1:5: note: candidate function not viable: requires 1 argument, but 0 were provided
int foo(int k) { return k; }
^
errt.cpp:6:6: error: called object type 'double *' is not a function or function pointer
p(); //calling something which is not a function
~^
errt.cpp:7:5: error: no matching function for call to 'foo'
foo(p); // improper usage
^~~
errt.cpp:1:5: note: candidate function not viable: no known conversion from 'double *' to 'int' for 1st argument; dereference the argument with *
int foo(int k) { return k; }
^
errt.cpp:8:12: error: cannot initialize a variable of type 'char (*)(int)' with an lvalue of type 'int (int)': different return type ('char' vs 'int')
char (*f)(int) = foo; // function mismatch
^ ~~~
4 errors generated.
Здравствуйте, Piko, Вы писали:
P>Здравствуйте, org_256, Вы писали: _>>1. Большую часть времени я пишу для платформы с большим ограничением по пространству-времени. ( робототехника ) P>Это распространённое заблуждение, что код на C более быстр и менее требователен. Если важна эффективность, C++ легко позволяет писать более оптимальные программы чем C.
Вы можите аргументировать, почему С++ позволяет писать более оптимальные программы? Равные — безусловно. При равном объеме кода — тоже. Но в общем случае "более", звучит довольно странно.
_>>7. Если бы все мои задачи требовали быстрого решения и реализации и не были бы требовательны к скорости выполнения и размерам кода, то да, я бы стал использовать С++ постоянно, даже не смотря на то, что этот язык просто чисто физически не возможно выучить на все 100%. P>даже выучив 50% C++, вы сможете делать более быстрые программы чем на C, либо более компактные чем на C (вообще одновременно максимальная компактность и максимальная скорость почти никогда не достигаются одновременно, в том числе и на C)
Вопрос к пункту один.
_>>8. Аргументы вроде: на современных машинах вызов через один указатель или через указатель на на таблицу указателей не имеет значения, потому что скорость на современных машинах ничтожна мала и не ощутима даже в супер-пупер-тестах... — для меня не аргумент... P>При чём тут вызов через указатель? P>Там где необходимо сделать runtime decision в C++, его также необходимо сделать и в C. P>Compile-time decision конечно быстрее чем runtime decision, но никто вас не заставляет делать runtime decision, где возможно compile-time. И кстати, C++ предоставляет намного более богатые возможности для реализации compile-time decision. P>Ярким примером является сравнение std::sort (C++ style) vs qsort (C-style) — как вы думаете, что быстрее? P>В std::sort как раз compile-time decision, а в qsort — runtime decision. P>http://www2.research.att.com/~bs/new_learning.pdf P>http://channel9.msdn.com/Events/GoingNative/GoingNative-2012/Keynote-Bjarne-Stroustrup-Cpp11-Style
Дык кто ж пользуется этой qsort? Я о ней вообще узнал только после двух лет программирования на Си)) А если сравнивать std::sort с сортировкой написанной под конкретную задачу — выигрывает последняя. За счет проигрыша в объеме кода.
_>>9. Аргументы вроде: На Си глобалы, код-лапша, легко насрать куда не нужно, что провоцирует трудновылавливаемые баги — тоже не аргументы. Баги есть даже в релизном коде многих успешных продуктов. P>какие-то детские рассуждения. P>То что баги есть во многих успешных проектах, ни капли не аргумент против того, что C++ позволяет писать программы с меньшим количеством багов (а значит быстрее). P>При грамотном использовании C++ позволяет находить многие баги при компиляции, либо не делать их вовсе (по сравнению с C). Да, все делают ошибки, но при грамотном использовании C++ позволяет делать меньше багов чем C.
В целом согласен, но грамотное использование чистого Си тоже позволяет обходиться без ошибок (но по сравнению С++ будет больше кода).
_>>12. Вся RMOS ( моя система для экспериментальных роботов-манипуляторов ) написана на С99. Далее LCC->AT89C51. ( лицензия есть ). P>Как я писал ранее — отсутствие компилятора действительно может затруднять использование С++, но как я уже писал есть компиляторы транслирующие код C++ в код C.
Иногда транслируют так, что как раз отсутствие компилятора С++ это аргумент его не использовать)) Ну во всяком случае так раньше было, может сейчас уже проще.
Здравствуйте, 11molniev, Вы писали:
_>>>1. Большую часть времени я пишу для платформы с большим ограничением по пространству-времени. ( робототехника ) P>>Это распространённое заблуждение, что код на C более быстр и менее требователен. Если важна эффективность, C++ легко позволяет писать более оптимальные программы чем C. 1>Вы можите аргументировать, почему С++ позволяет писать более оптимальные программы? Равные — безусловно. При равном объеме кода — тоже. Но в общем случае "более", звучит довольно странно.
пример qsort vs sort.
В qsort — runtime decision, в sort — compile-time, отсюда и скорость. И это не единственный пример.
_>>>7. Если бы все мои задачи требовали быстрого решения и реализации и не были бы требовательны к скорости выполнения и размерам кода, то да, я бы стал использовать С++ постоянно, даже не смотря на то, что этот язык просто чисто физически не возможно выучить на все 100%. P>>даже выучив 50% C++, вы сможете делать более быстрые программы чем на C, либо более компактные чем на C (вообще одновременно максимальная компактность и максимальная скорость почти никогда не достигаются одновременно, в том числе и на C) 1>Вопрос к пункту один.
ну так я не говорил что всегда одновременно получается достигнуть и скорость и компактность. либо то, либо другое, причём на C++ обе цели (по отдельности) достигаются легче чем на C.
_>>>8. Аргументы вроде: на современных машинах вызов через один указатель или через указатель на на таблицу указателей не имеет значения, потому что скорость на современных машинах ничтожна мала и не ощутима даже в супер-пупер-тестах... — для меня не аргумент... P>>При чём тут вызов через указатель? P>>Там где необходимо сделать runtime decision в C++, его также необходимо сделать и в C. P>>Compile-time decision конечно быстрее чем runtime decision, но никто вас не заставляет делать runtime decision, где возможно compile-time. И кстати, C++ предоставляет намного более богатые возможности для реализации compile-time decision. P>>Ярким примером является сравнение std::sort (C++ style) vs qsort (C-style) — как вы думаете, что быстрее? P>>В std::sort как раз compile-time decision, а в qsort — runtime decision. P>>http://www2.research.att.com/~bs/new_learning.pdf P>>http://channel9.msdn.com/Events/GoingNative/GoingNative-2012/Keynote-Bjarne-Stroustrup-Cpp11-Style 1>Дык кто ж пользуется этой qsort? Я о ней вообще узнал только после двух лет программирования на Си)) А если сравнивать std::sort с сортировкой написанной под конкретную задачу — выигрывает последняя. За счет проигрыша в объеме кода.
Вы понимаете почему std::sort быстрее? Посмотрите на ссылки которые я дал — там sort в несколько раз быстрее.
_>>>9. Аргументы вроде: На Си глобалы, код-лапша, легко насрать куда не нужно, что провоцирует трудновылавливаемые баги — тоже не аргументы. Баги есть даже в релизном коде многих успешных продуктов. P>>какие-то детские рассуждения. P>>То что баги есть во многих успешных проектах, ни капли не аргумент против того, что C++ позволяет писать программы с меньшим количеством багов (а значит быстрее). P>>При грамотном использовании C++ позволяет находить многие баги при компиляции, либо не делать их вовсе (по сравнению с C). Да, все делают ошибки, но при грамотном использовании C++ позволяет делать меньше багов чем C. 1>В целом согласен, но грамотное использование чистого Си тоже позволяет обходиться без ошибок (но по сравнению С++ будет больше кода).
не согласен: во-первых больше кода — больше ошибок, во-вторых такие штуки как RAII исключают возможность целых классов ошибок — то есть если вы знаете и используете RAII, то вы чисто технически не сможете сделать целую кучу ошибок.
_>>>12. Вся RMOS ( моя система для экспериментальных роботов-манипуляторов ) написана на С99. Далее LCC->AT89C51. ( лицензия есть ). P>>Как я писал ранее — отсутствие компилятора действительно может затруднять использование С++, но как я уже писал есть компиляторы транслирующие код C++ в код C. 1>Иногда транслируют так, что как раз отсутствие компилятора С++ это аргумент его не использовать)) Ну во всяком случае так раньше было, может сейчас уже проще.
да, как я сказал, пока — отсутствие компилятора это единственный более-менее разумный аргумент.
Здравствуйте, Piko, Вы писали:
P>Здравствуйте, 11molniev, Вы писали:
_>>>>1. Большую часть времени я пишу для платформы с большим ограничением по пространству-времени. ( робототехника ) P>>>Это распространённое заблуждение, что код на C более быстр и менее требователен. Если важна эффективность, C++ легко позволяет писать более оптимальные программы чем C. 1>>Вы можите аргументировать, почему С++ позволяет писать более оптимальные программы? Равные — безусловно. При равном объеме кода — тоже. Но в общем случае "более", звучит довольно странно.
P>http://www.rsdn.ru/forum/cpp/4731645.1.aspx
P>пример qsort vs sort. P>В qsort — runtime decision, в sort — compile-time, отсюда и скорость. И это не единственный пример.
Я то понимаю разницу между ними, но в том то и дело, что в чистом Си обычно именно compile-time. qsort — одно из немногих исключений. Все равно что виртуальные методы.
_>>>>7. Если бы все мои задачи требовали быстрого решения и реализации и не были бы требовательны к скорости выполнения и размерам кода, то да, я бы стал использовать С++ постоянно, даже не смотря на то, что этот язык просто чисто физически не возможно выучить на все 100%. P>>>даже выучив 50% C++, вы сможете делать более быстрые программы чем на C, либо более компактные чем на C (вообще одновременно максимальная компактность и максимальная скорость почти никогда не достигаются одновременно, в том числе и на C) 1>>Вопрос к пункту один.
P>ну так я не говорил что всегда одновременно получается достигнуть и скорость и компактность. либо то, либо другое, причём на C++ обе цели (по отдельности) достигаются легче чем на C.
ОК. Компактность — безусловно. Но скорость то на С++ достигается за счет legacy C.
_>>>>8. Аргументы вроде: на современных машинах вызов через один указатель или через указатель на на таблицу указателей не имеет значения, потому что скорость на современных машинах ничтожна мала и не ощутима даже в супер-пупер-тестах... — для меня не аргумент... P>>>При чём тут вызов через указатель? P>>>Там где необходимо сделать runtime decision в C++, его также необходимо сделать и в C. P>>>Compile-time decision конечно быстрее чем runtime decision, но никто вас не заставляет делать runtime decision, где возможно compile-time. И кстати, C++ предоставляет намного более богатые возможности для реализации compile-time decision. P>>>Ярким примером является сравнение std::sort (C++ style) vs qsort (C-style) — как вы думаете, что быстрее? P>>>В std::sort как раз compile-time decision, а в qsort — runtime decision. P>>>http://www2.research.att.com/~bs/new_learning.pdf P>>>http://channel9.msdn.com/Events/GoingNative/GoingNative-2012/Keynote-Bjarne-Stroustrup-Cpp11-Style 1>>Дык кто ж пользуется этой qsort? Я о ней вообще узнал только после двух лет программирования на Си)) А если сравнивать std::sort с сортировкой написанной под конкретную задачу — выигрывает последняя. За счет проигрыша в объеме кода.
P>Вы понимаете почему std::sort быстрее? Посмотрите на ссылки которые я дал — там sort в несколько раз быстрее.
Быстрей, потому что qsort делает вызовы функции сравнения. Лишние call/ret + использование стека по сравнению с С++. Реализация qsort под массив float без callback-a будет быстрей std::sort.
И таки не в несколько раз: 1,7 для 32 и 1,4 для 64 кода.
_>>>>9. Аргументы вроде: На Си глобалы, код-лапша, легко насрать куда не нужно, что провоцирует трудновылавливаемые баги — тоже не аргументы. Баги есть даже в релизном коде многих успешных продуктов. P>>>какие-то детские рассуждения. P>>>То что баги есть во многих успешных проектах, ни капли не аргумент против того, что C++ позволяет писать программы с меньшим количеством багов (а значит быстрее). P>>>При грамотном использовании C++ позволяет находить многие баги при компиляции, либо не делать их вовсе (по сравнению с C). Да, все делают ошибки, но при грамотном использовании C++ позволяет делать меньше багов чем C. 1>>В целом согласен, но грамотное использование чистого Си тоже позволяет обходиться без ошибок (но по сравнению С++ будет больше кода).
P>не согласен: во-первых больше кода — больше ошибок, во-вторых такие штуки как RAII исключают возможность целых классов ошибок — то есть если вы знаете и используете RAII, то вы чисто технически не сможете сделать целую кучу ошибок.
Это (в том числе и RAII) компенсируется в Си стандартом кодирования + выделением отдельного слоя api. Гарантия конечно не такая надежная, люди ошибаются чаще машин — но вполне себе работает. В качестве примера можно привести nginx — чистый Си, ничего не течет.
AD>>Вообще я ожидал услышать что-то типа "В случае <бла-бла-бла> был применён С++, но от него пришлось отказаться по причине <бла-бла-бла>. Код бы переписан на си, что привело к повышению <бла-бла-бла>", а получил кучу демагогии, из которой ничего не следует. Пичалька
Ну, по причине неадекватной сложности, ведущей к постоянной борьбе с языком, и постоянного вынужденного скатывания к синтаксическому онанизму. Плюс к тому ещё и высокая сложности разбора крешей в случае использования 'правильных' либ.
Привело к серьёзному упрощению кода, который теперь можно понять не изучая в течении нескольких лет методы высокой магии и прорицания в пространствах синтаксических подсластителей.
_>И вообще, каким нужно быть идиотом, чтобы создав проект, и на опираясь С++, вдруг, резко ни с того ни с сего решить даунсемплиться в Си?
Таким как я например. Больше года пишу новые проекты только на С, и рад что принял такое решение. И да, на С, но с исключениями, автоматическим управлением ресурсами и объектной моделью. С++ для всего этого не особенно и не нужен.
Как бы для уточнения, я использую С не по тому что не знаю или не умею готовить С++, но именно по тому что неплохо умею готовить и тот и другой. Дык вот, старый добрый С оказался на практике гораздо приятнее.
P.S.
То что С++ как-то сильно влияет на обнаружение ошибок в отличии от С — миф.
Здравствуйте, 11molniev, Вы писали:
_>>>>>1. Большую часть времени я пишу для платформы с большим ограничением по пространству-времени. ( робототехника ) P>>>>Это распространённое заблуждение, что код на C более быстр и менее требователен. Если важна эффективность, C++ легко позволяет писать более оптимальные программы чем C. 1>>>Вы можите аргументировать, почему С++ позволяет писать более оптимальные программы? Равные — безусловно. При равном объеме кода — тоже. Но в общем случае "более", звучит довольно странно. P>>http://www.rsdn.ru/forum/cpp/4731645.1.aspx
P>>пример qsort vs sort. P>>В qsort — runtime decision, в sort — compile-time, отсюда и скорость. И это не единственный пример. 1>Я то понимаю разницу между ними, но в том то и дело, что в чистом Си обычно именно compile-time.
Ну так там где в C возможно compile-time, оно возможно и в C++, причём в C++ — оно достигается намного легче/лучше/красивее. Я не призываю раздувать иерархии классов с виртуальным методами, там где возможно compile-time, и да я признаю что многие C++ проекты страдают от этого (из-за низкой квалификации разработчиков, и из-за слепого применения методов из других языков и т.п.)
_>>>>>7. Если бы все мои задачи требовали быстрого решения и реализации и не были бы требовательны к скорости выполнения и размерам кода, то да, я бы стал использовать С++ постоянно, даже не смотря на то, что этот язык просто чисто физически не возможно выучить на все 100%. P>>>>даже выучив 50% C++, вы сможете делать более быстрые программы чем на C, либо более компактные чем на C (вообще одновременно максимальная компактность и максимальная скорость почти никогда не достигаются одновременно, в том числе и на C) 1>>>Вопрос к пункту один. P>>ну так я не говорил что всегда одновременно получается достигнуть и скорость и компактность. либо то, либо другое, причём на C++ обе цели (по отдельности) достигаются легче чем на C. 1>ОК. Компактность — безусловно. Но скорость то на С++ достигается за счет legacy C.
это заблуждение. std::sort — это legacy C? expression templates — это legacy C? и т.п.
P>>Вы понимаете почему std::sort быстрее? Посмотрите на ссылки которые я дал — там sort в несколько раз быстрее. 1>Быстрей, потому что qsort делает вызовы функции сравнения. Лишние call/ret + использование стека по сравнению с С++.
даже если вызов функции сравнения в C++ не заинлайнится (то есть будет call/ret + stack), sort всё равно будет быстрее, так как прямой вызов.
1>Реализация qsort под массив float без callback-a будет быстрей std::sort. 1>И таки не в несколько раз: 1,7 для 32 и 1,4 для 64 кода.
Это ещё почему? для std::sort callback'и как правило инлайнятся.
P>>не согласен: во-первых больше кода — больше ошибок, во-вторых такие штуки как RAII исключают возможность целых классов ошибок — то есть если вы знаете и используете RAII, то вы чисто технически не сможете сделать целую кучу ошибок. 1>Это (в том числе и RAII) компенсируется в Си стандартом кодирования + выделением отдельного слоя api. Гарантия конечно не такая надежная, люди ошибаются чаще машин — но вполне себе работает.
так я не говорю что оно "вообще не работает". оно работает, но на C++ оно получается быстрее и безопасней.
ну вот пример, в блоке кода, пусть в функции, нужно при входе захватить мьютекс, открыть файл, и выделить память, при выходе соответственно нужно всё убрать.
Вы можете показать как это делается на C (в более-менее псевдокоде, 100% компилируемый исходник не нужен. просто используйте C-style), причём безопасно, с обработкой ошибок. + показать вызов такой функции.
1>В качестве примера можно привести nginx — чистый Си, ничего не течет.
вообще не аргумент.
можно что угодно написать хоть на ассемблере без протечек...
AD>>>Вообще я ожидал услышать что-то типа "В случае <бла-бла-бла> был применён С++, но от него пришлось отказаться по причине <бла-бла-бла>. Код бы переписан на си, что привело к повышению <бла-бла-бла>", а получил кучу демагогии, из которой ничего не следует. Пичалька AS>Ну, по причине неадекватной сложности, ведущей к постоянной борьбе с языком, и постоянного вынужденного скатывания к синтаксическому онанизму. Плюс к тому ещё и высокая сложности разбора крешей в случае использования 'правильных' либ.
если какие-то средства языка сложны для вас в использовании — не используйте их, если какие-то либы для вас не удобны — не используйте их, но это не причины баннить весь язык и все либы.
AS>Привело к серьёзному упрощению кода, который теперь можно понять не изучая в течении нескольких лет методы высокой магии и прорицания в пространствах синтаксических подсластителей.
что привело? переписывание на C? Так может если бы второй раз на C++ переписали, получилось бы не хуже?
AS>И да, на С, но с исключениями, автоматическим управлением ресурсами и объектной моделью. С++ для всего этого не особенно и не нужен.
Я не совсем понял, вы используете подмножество C++ ?
Или просто C? Как объектную модель можно на C сэумлировать — мне понятно. Но вот исключения и автоматическое управление ресурсами на С — сходу не соображу как сделать.
AS>Как бы для уточнения, я использую С не по тому что не знаю или не умею готовить С++, но именно по тому что неплохо умею готовить и тот и другой. Дык вот, старый добрый С оказался на практике гораздо приятнее.
ну — дело ваше, кому-то на ассемблере приятней.
AS>P.S. AS>То что С++ как-то сильно влияет на обнаружение ошибок в отличии от С — миф.
Здравствуйте, Piko, Вы писали:
P>да, хотя бы посмотрите на сортировку: P>что безопасней?
Между сильно влияет и безопаснее есть какая-то существенная связь?!
P>P.S. C++ позволяет не только лучше обнаруживать ошибки, но и не делать вовсе целые классы ошибок.
И на ещё большее количество ошибок он вообще не реагирует. Я же говорю, это не принципиально )))
Что есть, что нет — Рояля не играет.
Здравствуйте, 11molniev, Вы писали:
P>>>>В qsort — runtime decision, в sort — compile-time, отсюда и скорость. И это не единственный пример. 1>>>Я то понимаю разницу между ними, но в том то и дело, что в чистом Си обычно именно compile-time. P>>Ну так там где в C возможно compile-time, оно возможно и в C++, причём в C++ — оно достигается намного легче/лучше/красивее. Я не призываю раздувать иерархии классов с виртуальным методами, там где возможно compile-time, и да я признаю что многие C++ проекты страдают от этого (из-за низкой квалификации разработчиков, и из-за слепого применения методов из других языков и т.п.) 1>Дык о том речь, что runtime decision получаеться в Си только посредством усилий разработчика, а в плюсах и без оных.
а чем принципиально indirect call отличается от virtual call в контексте runtime decision? и то и то получается посредством усилий разработчика
_>>>>>>>7. Если бы все мои задачи требовали быстрого решения и реализации и не были бы требовательны к скорости выполнения и размерам кода, то да, я бы стал использовать С++ постоянно, даже не смотря на то, что этот язык просто чисто физически не возможно выучить на все 100%. P>>>>>>даже выучив 50% C++, вы сможете делать более быстрые программы чем на C, либо более компактные чем на C (вообще одновременно максимальная компактность и максимальная скорость почти никогда не достигаются одновременно, в том числе и на C) 1>>>>>Вопрос к пункту один. P>>>>ну так я не говорил что всегда одновременно получается достигнуть и скорость и компактность. либо то, либо другое, причём на C++ обе цели (по отдельности) достигаются легче чем на C. 1>>>ОК. Компактность — безусловно. Но скорость то на С++ достигается за счет legacy C. P>>это заблуждение. std::sort — это legacy C? expression templates — это legacy C? и т.п. 1>std::sort, expression templates, это способ уменьшить объем кода, а не ускорить его выполнение. В чем заблуждение?
ещё раз, вы говорите, что скорость C++ достигается за счёт legacy C.
std::sort это legacy С?
или вы имеете ввиду то, что для любого C++ кода можно написать аналогичный C код? если да, то я и не спорю — да можно, есть даже авто трансляторы с C++ на C. вот только размер аналогичного С кода будет не меньше, а в большинстве случаев больше в разы.
P>>>>Вы понимаете почему std::sort быстрее? Посмотрите на ссылки которые я дал — там sort в несколько раз быстрее. 1>>>Быстрей, потому что qsort делает вызовы функции сравнения. Лишние call/ret + использование стека по сравнению с С++. P>>даже если вызов функции сравнения в C++ не заинлайнится (то есть будет call/ret + stack), sort всё равно будет быстрее, так как прямой вызов. 1>qsort из Си будет медленней, чем std::sort.
ну вот, а товарищ org_256, говорит что идентичны, и при этом принимает за оскорбление:
Не примите за оскорбление, но вы сильно заблуждаетесь на счёт своего знания C++.
1>std::sort будет медленней алгоритма сортировки для double*.
вы имеете ввиду специальные алгоритмы (типа Radix sort) отличные от quicksort?
ну так C++ и в этом месте лучше — можно сделать специализацию для double*, либо вообще для T* — причём интерфейс не поменяется.
1>C++ выигрывает в скорости при одинаковом объеме кода, проигрывает при разном.
вы имеете ввиду использование специальных алгоритмов, для специальных случаев?
1>>>Реализация qsort под массив float без callback-a будет быстрей std::sort. 1>>>И таки не в несколько раз: 1,7 для 32 и 1,4 для 64 кода. P>>Это ещё почему? для std::sort callback'и как правило инлайнятся. 1>Потому что оверхейд больший.
на что именно оверхед, ваши предположения?
1>Если хотите скину код, состряпанный на скорую руку.
если не трудно — то скиньте, мне будет интересно. можно сюда, а можно в http://ideone.com/
1>Для qsort кстати функция сравнения не инлайница
браво
P>>>>не согласен: во-первых больше кода — больше ошибок, во-вторых такие штуки как RAII исключают возможность целых классов ошибок — то есть если вы знаете и используете RAII, то вы чисто технически не сможете сделать целую кучу ошибок. 1>>>Это (в том числе и RAII) компенсируется в Си стандартом кодирования + выделением отдельного слоя api. Гарантия конечно не такая надежная, люди ошибаются чаще машин — но вполне себе работает. P>>так я не говорю что оно "вообще не работает". оно работает, но на C++ оно получается быстрее и безопасней. P>>ну вот пример, в блоке кода, пусть в функции, нужно при входе захватить мьютекс, открыть файл, и выделить память, при выходе соответственно нужно всё убрать. P>>Вы можете показать как это делается на C (в более-менее псевдокоде, 100% компилируемый исходник не нужен. просто используйте C-style), причём безопасно, с обработкой ошибок. + показать вызов такой функции.
1>ОК, я не стал все копировать, но общие моменты я думаю будут ясны.
вот буквально за 10 секунд увидел:
Я правильно понимаю, если это сфейлится
1> RETNULL( p = memalloc( ... ) );
то это
1> LeaveCriticalSection(&cs);
не вызовется?
...
даже для C, я ожидал увидеть меньше кода, так как имел в виду псевдокод.
причём try, может быть намного выше в call hierarchy, когда в C надо сравнивать код всё время.
Я думаю даже без причёсывания вашего C-style варианта, видно что безопасней и легче.
1>>>В качестве примера можно привести nginx — чистый Си, ничего не течет. P>>вообще не аргумент. P>>можно что угодно написать хоть на ассемблере без протечек... 1>И да и нет. Подобный пример опровергает утверждение, что больше кода — больше ошибок. Есть ещё человеческий фактор.
я считаю не опровергает.
важно рассматривать одновременно: объём кода, время затраченное на его написание (грубо говоря строк/час), и количество ошибок.
например 10000строчный проект мог полироваться 20 лет, естественно в нём может быть меньше ошибок чем в проекте на 1000строк написанному за день.
P>Или просто C? Как объектную модель можно на C сэумлировать — мне понятно. Но вот исключения и автоматическое управление ресурсами на С — сходу не соображу как сделать.
Исключения делаются на setjmp. Автоматическое управление ресурсами — не знаю как. Впрочем, мне неизвестны языки с автоматическим управлением ресурсами, кроме С++.
Здравствуйте, Alexéy Sudachén, Вы писали:
P>>что привело? переписывание на C? Так может если бы второй раз на C++ переписали, получилось бы не хуже? P>>Я не совсем понял, вы используете подмножество C++ ? P>>Или просто C? Как объектную модель можно на C сэумлировать — мне понятно. Но вот исключения и автоматическое управление ресурсами на С — сходу не соображу как сделать. AS>С и С++ разные языки. Считать один подмножеством другого — большая ошибка, говорящая о незнании одного из языков, ну или обоих.
Что мешает использовать то подмножество C++, которое комфортно вам? (я знаю что множество C не полностью входит в C++)
AS>То что вы чего-то не видите или не соображаете, означает ровно то что означает. Как сделать я уже не раз писал.
если вам трудно описать как вы используете автоматическое управление ресурсами на C и исключения, хотя бы в паре предложений, я не вижу смысла продолжения моего общения с вами
Здравствуйте, Vamp, Вы писали:
P>>Или просто C? Как объектную модель можно на C сэумлировать — мне понятно. Но вот исключения и автоматическое управление ресурсами на С — сходу не соображу как сделать. V>Исключения делаются на setjmp.
ок, но вот зачем грызть этот кактус? (это вопрос не к вам. что-то типа риторического)
V> Автоматическое управление ресурсами — не знаю как. Впрочем, мне неизвестны языки с автоматическим управлением ресурсами, кроме С++.
вроде D. но не суть.
Alexéy Sudachén вроде как умеет это делать на C, правда не показывает
Здравствуйте, Piko, Вы писали:
P>Здравствуйте, 11molniev, Вы писали:
P>>>>>В qsort — runtime decision, в sort — compile-time, отсюда и скорость. И это не единственный пример. 1>>>>Я то понимаю разницу между ними, но в том то и дело, что в чистом Си обычно именно compile-time. P>>>Ну так там где в C возможно compile-time, оно возможно и в C++, причём в C++ — оно достигается намного легче/лучше/красивее. Я не призываю раздувать иерархии классов с виртуальным методами, там где возможно compile-time, и да я признаю что многие C++ проекты страдают от этого (из-за низкой квалификации разработчиков, и из-за слепого применения методов из других языков и т.п.) 1>>Дык о том речь, что runtime decision получаеться в Си только посредством усилий разработчика, а в плюсах и без оных. P>а чем принципиально indirect call отличается от virtual call в контексте runtime decision? и то и то получается посредством усилий разработчика
В С эти усилия всегда в явном виде. С++ можно и без усилий получить их по дефолту. Проще говоря на чистом Си тормоза всегда являются результатом осознанного решения разработчика. Только то и всего.
_>>>>>>>>7. Если бы все мои задачи требовали быстрого решения и реализации и не были бы требовательны к скорости выполнения и размерам кода, то да, я бы стал использовать С++ постоянно, даже не смотря на то, что этот язык просто чисто физически не возможно выучить на все 100%. P>>>>>>>даже выучив 50% C++, вы сможете делать более быстрые программы чем на C, либо более компактные чем на C (вообще одновременно максимальная компактность и максимальная скорость почти никогда не достигаются одновременно, в том числе и на C) 1>>>>>>Вопрос к пункту один. P>>>>>ну так я не говорил что всегда одновременно получается достигнуть и скорость и компактность. либо то, либо другое, причём на C++ обе цели (по отдельности) достигаются легче чем на C. 1>>>>ОК. Компактность — безусловно. Но скорость то на С++ достигается за счет legacy C. P>>>это заблуждение. std::sort — это legacy C? expression templates — это legacy C? и т.п. 1>>std::sort, expression templates, это способ уменьшить объем кода, а не ускорить его выполнение. В чем заблуждение? P>ещё раз, вы говорите, что скорость C++ достигается за счёт legacy C.
Да. P>std::sort это legacy С?
Нет.
P>или вы имеете ввиду то, что для любого C++ кода можно написать аналогичный C код? если да, то я и не спорю — да можно, есть даже авто трансляторы с C++ на C. вот только размер аналогичного С кода будет не меньше, а в большинстве случаев больше в разы.
Нет. Я имею в виду, что получить максимальную скорость в плюсах можно используя для критичных участков кода чистый Си. Если вместо вызова std::sort вы напишите быстрою сортировку на си, она будет работать быстрей.
Ещё раз — qsort, это быстрая сортировка на Си для произвольных структур. Она заведомо проигранная в скорости. Осознанный выбор, когда в этом месте программы на её скорость можно наплевать.
Да размер кода будет больше. Я собственно везде об этом и говорю. Лично для меня основное преимущество С++, когда я использую его, вместо С — это объем кода.
P>>>>>Вы понимаете почему std::sort быстрее? Посмотрите на ссылки которые я дал — там sort в несколько раз быстрее. 1>>>>Быстрей, потому что qsort делает вызовы функции сравнения. Лишние call/ret + использование стека по сравнению с С++. P>>>даже если вызов функции сравнения в C++ не заинлайнится (то есть будет call/ret + stack), sort всё равно будет быстрее, так как прямой вызов. 1>>qsort из Си будет медленней, чем std::sort. P>ну вот, а товарищ org_256, говорит что идентичны, и при этом принимает за оскорбление: P>
P>Не примите за оскорбление, но вы сильно заблуждаетесь на счёт своего знания C++.
Ну все мы люди, все делаем ошибки. Надеюсь вы пояснили ему причину его заблуждения.
1>>std::sort будет медленней алгоритма сортировки для double*.
P>вы имеете ввиду специальные алгоритмы (типа Radix sort) отличные от quicksort? P>ну так C++ и в этом месте лучше — можно сделать специализацию для double*, либо вообще для T* — причём интерфейс не поменяется.
Да нет же. И шаблоны я знаю.
1>>C++ выигрывает в скорости при одинаковом объеме кода, проигрывает при разном. P>вы имеете ввиду использование специальных алгоритмов, для специальных случаев?
Нет.
1>>>>Реализация qsort под массив float без callback-a будет быстрей std::sort. 1>>>>И таки не в несколько раз: 1,7 для 32 и 1,4 для 64 кода. P>>>Это ещё почему? для std::sort callback'и как правило инлайнятся. 1>>Потому что оверхейд больший.
P>на что именно оверхед, ваши предположения?
Мое предложение посмотреть в дизассемблере, но так навскидку, первое что попало на глаза:
000000013FC41805 E8 C6 00 00 00 call std::_Unguarded_partition<double * __ptr64> (13FC418D0h)
1>>Если хотите скину код, состряпанный на скорую руку.
P>если не трудно — то скиньте, мне будет интересно. можно сюда, а можно в http://ideone.com/ http://pastebin.com/YsGRBtZ0 — только #include "stdafx.h" уберите, я забыл http://ideone.com/iL6Gb
На скорую рука, так что не очень, но общий подход иллюстрирует.
1>>Для qsort кстати функция сравнения не инлайница P>браво
Я обратил ваше внимание на то, почему в приведенном вами сравнении выигрывает С++. И как это исправить.
P>>>>>не согласен: во-первых больше кода — больше ошибок, во-вторых такие штуки как RAII исключают возможность целых классов ошибок — то есть если вы знаете и используете RAII, то вы чисто технически не сможете сделать целую кучу ошибок. 1>>>>Это (в том числе и RAII) компенсируется в Си стандартом кодирования + выделением отдельного слоя api. Гарантия конечно не такая надежная, люди ошибаются чаще машин — но вполне себе работает. P>>>так я не говорю что оно "вообще не работает". оно работает, но на C++ оно получается быстрее и безопасней. P>>>ну вот пример, в блоке кода, пусть в функции, нужно при входе захватить мьютекс, открыть файл, и выделить память, при выходе соответственно нужно всё убрать. P>>>Вы можете показать как это делается на C (в более-менее псевдокоде, 100% компилируемый исходник не нужен. просто используйте C-style), причём безопасно, с обработкой ошибок. + показать вызов такой функции.
1>>ОК, я не стал все копировать, но общие моменты я думаю будут ясны.
P>вот буквально за 10 секунд увидел:
P>Я правильно понимаю, если это сфейлится
1>> RETNULL( p = memalloc( ... ) );
P>то это
1>> LeaveCriticalSection(&cs);
P>не вызовется?
Да. Её следовало вынести за ret. P>...
P>даже для C, я ожидал увидеть меньше кода, так как имел в виду псевдокод.
P>Вот пример на C++ P>
И? Померились?
P>причём try, может быть намного выше в call hierarchy, когда в C надо сравнивать код всё время.
И ещё чаще его там в итоге не будет для выбрасываемого типа исключения)))
P>Я думаю даже без причёсывания вашего C-style варианта, видно что безопасней и легче.
Чем меряете безопасность и легкость кода? Всетаки субъективные критерии. Помимо наличия конструкторов и деструкторов.
1>>>>В качестве примера можно привести nginx — чистый Си, ничего не течет. P>>>вообще не аргумент. P>>>можно что угодно написать хоть на ассемблере без протечек... 1>>И да и нет. Подобный пример опровергает утверждение, что больше кода — больше ошибок. Есть ещё человеческий фактор.
P>я считаю не опровергает. P>важно рассматривать одновременно: объём кода, время затраченное на его написание (грубо говоря строк/час), и количество ошибок. P>например 10000строчный проект мог полироваться 20 лет, естественно в нём может быть меньше ошибок чем в проекте на 1000строк написанному за день.
Ну дык потому и привожу в пример nginx. Кода там немало, и делался не 20 лет.
Здравствуйте, Alexéy Sudachén, Вы писали:
AS>>>С и С++ разные языки. Считать один подмножеством другого — большая ошибка, говорящая о незнании одного из языков, ну или обоих. P>>Что мешает использовать то подмножество C++, которое комфортно вам? (я знаю что множество C не полностью входит в C++) AS>Тем что это не даёт возможности решать задачу в терминах С.
[...]
это был не вопрос, а цитата, с целью ткнуть тебя в то, что я знаю что С — не полностью входит в C++. а ты распетушился...
Dr. Memory version 1.4.0 build 1 built on Jan 3 2012 23:51:15
Application cmdline: ""C:\Projects\12\1.exe" "1.c""
Recorded 32 suppression(s) from default c:\visus\drm/bin/suppress-default.txt
DUPLICATE ERROR COUNTS:
SUPPRESSIONS USED:
NO ERRORS FOUND:
0 unique, 0 total unaddressable access(es)
0 unique, 0 total uninitialized access(es)
0 unique, 0 total invalid heap argument(s)
0 unique, 0 total warning(s)
0 unique, 0 total, 0 byte(s) of leak(s)
0 unique, 0 total, 0 byte(s) of possible leak(s)
ERRORS IGNORED:
153 still-reachable allocation(s)
(re-run with "-show_reachable" for details)
P>Я думаю даже без причёсывания вашего C-style варианта, видно что безопасней и легче.
Здравствуйте, Piko, Вы писали:
P>Здравствуйте, Alexéy Sudachén, Вы писали:
AS>>>>С и С++ разные языки. Считать один подмножеством другого — большая ошибка, говорящая о незнании одного из языков, ну или обоих. P>>>Что мешает использовать то подмножество C++, которое комфортно вам? (я знаю что множество C не полностью входит в C++) AS>>Тем что это не даёт возможности решать задачу в терминах С. P>[...]
P>это был не вопрос, а цитата, с целью ткнуть тебя в то, что я знаю что С — не полностью входит в C++. а ты распетушился...
Хм, ... ладно, не буду писать что хотел, всё таки публичное место, забанят ещё ))) Однако я не телепат, шоб значит определить что вопрос не вопрос, а цитата, што бы показать что типа что-то знаешь, но не совсем ... и сделать отсюда далеко идущие выводы )))
Пожалуй надо сделать так, шоб в телепатов не играть: P>>>Что мешает использовать то подмножество C++, которое комфортно вам? (я знаю что множество C не полностью входит в C++)
Этот кастрированный С хуже чем кастрированный С++, на котором по своей природной доброте предлагают писать всем 'неАсилившим нормальный С++', адепты двух плюсов. А вот нет такого (комфортного) подмножества. Его придумали С++ программисты, чтобы считать что они умеют писать на С, ведь С++ включает его в себя, не правда ли. Ну с мелкими оговорками, которые право дело, совершенно не важны.
Здравствуйте, Alexéy Sudachén, Вы писали:
AS>>>>>С и С++ разные языки. Считать один подмножеством другого — большая ошибка, говорящая о незнании одного из языков, ну или обоих. P>>>>Что мешает использовать то подмножество C++, которое комфортно вам? (я знаю что множество C не полностью входит в C++) AS>>>Тем что это не даёт возможности решать задачу в терминах С. P>>[...]
P>>это был не вопрос, а цитата, с целью ткнуть тебя в то, что я знаю что С — не полностью входит в C++. а ты распетушился...
AS>Хм, ... ладно, не буду писать что хотел, всё таки публичное место, забанят ещё ))) Однако я не телепат, шоб значит определить что вопрос не вопрос, а цитата, што бы показать что типа что-то знаешь, но не совсем ... и сделать отсюда далеко идущие выводы )))
специально для не телепатов, я сделал ссылку , и вставил как цитату в тэг q
Здравствуйте, Piko, Вы писали:
P>специально для не телепатов, я сделал ссылку , и вставил как цитату в тэг q
Классно, тогда для не телепатов, продолжи свою мысль. Что ты хотел сказать этой цитатой? Потому как мне как не телепату, это видится в единственно возможной аналогии 'небо синее, вода мокрая'. В совокупности с советом всегда писать на С++, это ровным счётом ничего нового не говорит. Не телепатам )
Здравствуйте, Alexéy Sudachén, Вы писали:
P>>специально для не телепатов, я сделал ссылку , и вставил как цитату в тэг q
AS>Классно, тогда для не телепатов, продолжи свою мысль. Что ты хотел сказать этой цитатой? Потому как мне как не телепату, это видится в единственно возможной аналогии 'небо синее, вода мокрая'. В совокупности с советом всегда писать на С++, это ровным счётом ничего нового не говорит. Не телепатам )
ну вообще история следующая, по мне так всё должно быть понятно.
AS>>>>>>И да, на С, но с исключениями, автоматическим управлением ресурсами и объектной моделью. С++ для всего этого не особенно и не нужен.
P>>>>>Я не совсем понял, вы используете подмножество C++ ? P>>>>> Или просто C? Как объектную модель можно на C сэумлировать — мне понятно. Но вот исключения и автоматическое управление ресурсами на С — сходу не соображу как сделать.
AS>>>>С и С++ разные языки. Считать один подмножеством другого — большая ошибка, говорящая о незнании одного из языков, ну или обоих.
P>>>http://www.rsdn.ru/forum/cpp/4730917.1.aspx
P>>> [quote tag] P>>>Что мешает использовать то подмножество C++, которое комфортно вам? (я знаю что множество C не полностью входит в C++) P>>>[/quote tag]
AS>>Тем что это не даёт возможности решать задачу в терминах С. Недоступны принципиальные возможности, дико порицаемые адептами двух плюсов. Если вы сможете компилировать свой C код C++ компилятором, то вам просто кажется что вы пишете на С, но на самом деле лишь на подмножестве С++. AS>> [...] ИМХО, но страус просто неАсилил научится писать на С )))
P> это был не вопрос, а цитата, с целью ткнуть тебя в то, что я знаю что С — не полностью входит в C++. а ты распетушился...
Здравствуйте, 11molniev, Вы писали:
P>>а чем принципиально indirect call отличается от virtual call в контексте runtime decision? и то и то получается посредством усилий разработчика 1>В С эти усилия всегда в явном виде. С++ можно и без усилий получить их по дефолту. Проще говоря на чистом Си тормоза всегда являются результатом осознанного решения разработчика. Только то и всего.
а где в C++ их можно получить по дефолту, да так чтобы не знать об этом?
я когда пишу virtual — всегда осознаю, что в 99% случаев это будет indirect call через vtable
P>>или вы имеете ввиду то, что для любого C++ кода можно написать аналогичный C код? если да, то я и не спорю — да можно, есть даже авто трансляторы с C++ на C. вот только размер аналогичного С кода будет не меньше, а в большинстве случаев больше в разы. 1>Нет. Я имею в виду, что получить максимальную скорость в плюсах можно используя для критичных участков кода чистый Си. Если вместо вызова std::sort вы напишите быстрою сортировку на си, она будет работать быстрей.
надо попробовать в эту ручную сортировку привести к интерфейсу std::sort, может разность в скорости обуславливается разными алгоритмами?
1>Ещё раз — qsort, это быстрая сортировка на Си для произвольных структур. Она заведомо проигранная в скорости. Осознанный выбор, когда в этом месте программы на её скорость можно наплевать. 1>Да размер кода будет больше. Я собственно везде об этом и говорю. Лично для меня основное преимущество С++, когда я использую его, вместо С — это объем кода.
ну да, на С можно сделать тоже самое, но кода почти всегда будет больше. И вот этот дополнительный код на C, который автоматом генерируется на C++, зачастую и не пишется.
1>>>std::sort будет медленней алгоритма сортировки для double*.
P>>вы имеете ввиду специальные алгоритмы (типа Radix sort) отличные от quicksort? P>>ну так C++ и в этом месте лучше — можно сделать специализацию для double*, либо вообще для T* — причём интерфейс не поменяется. 1>Да нет же. И шаблоны я знаю. 1>>>C++ выигрывает в скорости при одинаковом объеме кода, проигрывает при разном. P>>вы имеете ввиду использование специальных алгоритмов, для специальных случаев? 1>Нет.
я просто пытался понять, что вы имели ввиду...
1>>>Если хотите скину код, состряпанный на скорую руку.
P>>если не трудно — то скиньте, мне будет интересно. можно сюда, а можно в http://ideone.com/ 1>http://pastebin.com/YsGRBtZ0 — только #include "stdafx.h" уберите, я забыл 1>http://ideone.com/iL6Gb 1>На скорую рука, так что не очень, но общий подход иллюстрирует.
1>>>Для qsort кстати функция сравнения не инлайница P>>браво 1>Я обратил ваше внимание на то, почему в приведенном вами сравнении выигрывает С++. И как это исправить.
да, именно, не инлайница/indirect call это основные факты почему быстрее..
P>>>>Вы можете показать как это делается на C (в более-менее псевдокоде, 100% компилируемый исходник не нужен. просто используйте C-style), причём безопасно, с обработкой ошибок. + показать вызов такой функции. 1>>>ОК, я не стал все копировать, но общие моменты я думаю будут ясны.
P>>вот буквально за 10 секунд увидел: P>>Я правильно понимаю, если это сфейлится 1>>> RETNULL( p = memalloc( ... ) ); P>>то это 1>>> LeaveCriticalSection(&cs); P>>не вызовется? 1>Да. Её следовало вынести за ret.
с указателями конечно немного легче тем, что free ничего не делает для для нулевых указателей.
Но вот чтобы вы сделали если бы было 3 совершенно абстрактных ресурса? Делали бы 3 метки?
1>И? Померились?
?? я с вами мерится не собирался, мне интересно сравнение C vc C++, без личностей...
P>>причём try, может быть намного выше в call hierarchy, когда в C надо сравнивать код всё время. 1>И ещё чаще его там в итоге не будет для выбрасываемого типа исключения)))
catch(std::exception const& e){}
catch(...){}
P>>Я думаю даже без причёсывания вашего C-style варианта, видно что безопасней и легче. 1>Чем меряете безопасность и легкость кода? Всетаки субъективные критерии. Помимо наличия конструкторов и деструкторов.
легкость: кода меньше. код лаконичней. вообще не надо парится об корректном сборе ресурсов.
безопасность: кода меньше. код лаконичней. вообще не надо парится об корректном сборе ресурсов.
вы в своём коде сделали ошибку, я думаю наверняка не одну. проблема не в вас, а в самом подходе, я бы тоже сделал ошибку в вашем случае, потому что код намного сложнее.
Здравствуйте, 11molniev, Вы писали:
P>>>>а чем принципиально indirect call отличается от virtual call в контексте runtime decision? и то и то получается посредством усилий разработчика 1>>>В С эти усилия всегда в явном виде. С++ можно и без усилий получить их по дефолту. Проще говоря на чистом Си тормоза всегда являются результатом осознанного решения разработчика. Только то и всего. P>>а где в C++ их можно получить по дефолту, да так чтобы не знать об этом? P>>я когда пишу virtual — всегда осознаю, что в 99% случаев это будет indirect call через vtable 1>Сама концепция объекта как черного ящика их предполагает.
поясните что именно вы имеете ввиду, в данном контексте
P>>>>или вы имеете ввиду то, что для любого C++ кода можно написать аналогичный C код? если да, то я и не спорю — да можно, есть даже авто трансляторы с C++ на C. вот только размер аналогичного С кода будет не меньше, а в большинстве случаев больше в разы. 1>>>Нет. Я имею в виду, что получить максимальную скорость в плюсах можно используя для критичных участков кода чистый Си. Если вместо вызова std::sort вы напишите быстрою сортировку на си, она будет работать быстрей. P>>надо попробовать в эту ручную сортировку привести к интерфейсу std::sort, может разность в скорости обуславливается разными алгоритмами? 1>Разница обусловлена только тем, что std::sort будучи функцией с большей функциональностью (в плане данных над которыми она применяется) за эту функциональность платит скоростью. Более общее решение всегда медленней частного.
Вы видели
template <class RandomAccessIterator>
void qSortIT(RandomAccessIterator first, RandomAccessIterator last)
?
как сильно оно отличается по функциональности от std::sort?
Может всё-таки дело в разных алгоритмах? std::sort это ведь не обязательно quicksort
1>Я честно сказать не совсем улавливаю о чем мы спорим: С++ даст более компактный код. С даст более быстрый код. С++ со вставками legacy в нужных местах даст скорость, во всех остальных — компактность.
нет. при использовании шаблонов, при определении специализаций для небольших особенностей, при определении алгоритмов которые принимают сущности с большим набором небольших особенностей, полный код алгоритма учитывающий каждую особенность сгенерируется автоматом, и будет он не медленней, а то и быстрее legacy C, так как вручную все эти особенности учесть на несколько порядков труднее.
1>Если пропихнуть вместо legacy С asm — будет ещё быстрей (если конечно есть опыт программирования на нем и время на профайлер).
это тоже заблуждение, компиляторы сейчас обладают большими знаниями в оптимизации, чем люди.
если речь идёт о расширениях типа sse — то во-первых, сейчас компиляторы умеют делать автовекторизацию, во-вторых если всё-же придётся использовать sse вручную, то это будет не asm, а intrinsic, и в-третьих эти intrinsic при грамотном дизайне не будут разбросаны по всему проекту, а будут аккуратно обвёрнуты в маленькие абстракции.
Пример, http://eigen.tuxfamily.org/index.php?title=Main_Page — см раздел "Eigen is fast"
Тесты: http://eigen.tuxfamily.org/index.php?title=Benchmark как видите, Eigen уделывает legacy код на многих участках.
Так что миф об legacy speed — это миф.
1>>>Ещё раз — qsort, это быстрая сортировка на Си для произвольных структур. Она заведомо проигранная в скорости. Осознанный выбор, когда в этом месте программы на её скорость можно наплевать. 1>>>Да размер кода будет больше. Я собственно везде об этом и говорю. Лично для меня основное преимущество С++, когда я использую его, вместо С — это объем кода. P>>ну да, на С можно сделать тоже самое, но кода почти всегда будет больше. И вот этот дополнительный код на C, который автоматом генерируется на C++, зачастую и не пишется. 1>Да вы правы. Но у меня сложилась мнение, что вы считаете это только недостатком. Я же полагаю, что иногда это недостаток, а иногда достоинство.
Почему достоинство?
Перед чем достоинство? — на C++ возможны оба подхода, а на C по большому счёту только один
1>>>>>std::sort будет медленней алгоритма сортировки для double*. P>>>>вы имеете ввиду специальные алгоритмы (типа Radix sort) отличные от quicksort? P>>>>ну так C++ и в этом месте лучше — можно сделать специализацию для double*, либо вообще для T* — причём интерфейс не поменяется. 1>>>Да нет же. И шаблоны я знаю. 1>>>>>C++ выигрывает в скорости при одинаковом объеме кода, проигрывает при разном. P>>>>вы имеете ввиду использование специальных алгоритмов, для специальных случаев? 1>>>Нет. P>>я просто пытался понять, что вы имели ввиду... 1>В коде образец. Я постараюсь объяснить, если вы сформулируете вопрос.
Понимаете, для сортировки есть разные алгоритмы, разные реализации std::sort
1>>>>>Если хотите скину код, состряпанный на скорую руку. P>>>>если не трудно — то скиньте, мне будет интересно. можно сюда, а можно в http://ideone.com/ 1>>>http://pastebin.com/YsGRBtZ0 — только #include "stdafx.h" уберите, я забыл 1>>>http://ideone.com/iL6Gb 1>>>На скорую рука, так что не очень, но общий подход иллюстрирует. P>>http://pastebin.com/QXPU0zWC P>>test_c2 и test_cplusplus3 по скорости примерно одинаковы. 1>На N=100000000, qsort: 28.758331, std::sort: 20.791297, c: 17.333931 соотношение 1,38 и 1,199 1>На N=10000000 qsort: 2.567289, std::sort: 1.824936, c: 1.510803 соотношение 1,40 и 1,20 1>т.е. то о чем я говорю: переписывания куска кода на чистый с раздуло этот код и ускорило его работу на ~20 процентов. В два раза меньше чем использование std::sort вместо qsort — так что цифры увеличения скорости вполне сопоставимы. 1>Единственный момент: это 64 разрядный код, std::sort при N=100000000 на 32 битах вылетело с исключением)). Для 32 qsort vs std::sort получается в районе 1,6.
Вы видели test_cplusplus3 ????? У вас там есть разница в скорости?
Кстати, сравнивать сортировку на разных наборах случайных данных не корректно, на определённых данных quicksort вообще может взрываться до N^2.
1>>>>>Для qsort кстати функция сравнения не инлайница P>>>>браво 1>>>Я обратил ваше внимание на то, почему в приведенном вами сравнении выигрывает С++. И как это исправить. P>>да, именно, не инлайница/indirect call это основные факты почему быстрее.. 1>Но неинлайница, потому как qsort — функция "обобщенная". И по факту в коде она не используется. Ну как wchar_t под unix. Наверное самая близкая аналогия.
ну std::sort ведь тоже обобщённая, и при этом всё инлайнится
1>>>И? Померились? P>>?? я с вами мерится не собирался, мне интересно сравнение C vc C++, без личностей... 1>Извините, если восприняли, как переход на личности (хотя подтекст не скрою)) ). Просто очевидно, что С предоставляет меньшие возможности по инициализации/освобождению ресурсов и в подобных сравнениях кода на С будет больше, чем на плюсах.
я думаю при создании функции с 10 ресурсами, как минимум большинство программистов сделает ошибку, а то и не одну.
Зачем вообще надрываться и использовать C, когда есть C++? (естественно, кроме тех случаев когда использование C++ невозможно из-за отсутствия компилятора)
1>Особенно если классы выносить из описания)).
ну так в этом и смысл, в C++ управление ресурсом можно сделать один раз, и потом использовать многократно. В C такое вынесение практически не возможно (многоэтажные макросы не в счёт), и приходится постоянно тратить время на контроль ресурсов
1>Поэтому я лично слабо улавливаю, что вы хотите показать этим сравнением. Код на С++ компактней. Ну так в этом то наши мнения совпадают.
далеко не все это понимают.
помимо компактности — это ещё и безопасность и надёжность.
1>Я кстати как то не обращал внимания на такой способ захвата объектов синхронизации, так что спасибо за ваш пример.
рад что вам это пригодится. это касается любых ресурсов.
P>>>>Я думаю даже без причёсывания вашего C-style варианта, видно что безопасней и легче. 1>>>Чем меряете безопасность и легкость кода? Всетаки субъективные критерии. Помимо наличия конструкторов и деструкторов. P>>легкость: кода меньше. код лаконичней. вообще не надо парится об корректном сборе ресурсов. P>>безопасность: кода меньше. код лаконичней. вообще не надо парится об корректном сборе ресурсов. P>>вы в своём коде сделали ошибку, я думаю наверняка не одну. проблема не в вас, а в самом подходе, я бы тоже сделал ошибку в вашем случае, потому что код намного сложнее. 1>Отчасти я с вами согласен. Но и вы отнеситесь с пониманием: С язык очень простой. Фактически — простыня вызова функций. Поэтому когда сложный алгоритм предварительно просчитан, разбит на составляющие, использование си приводит к тупому переносу алгоритма с одного языка на другой. И это тоже уменьшает ошибки. Да на С++ кода меньше и он лаконичней, но это достигается его большей информационной емкостью, а значит повышает сложность. Смотрите сами: есть класс — значит есть конструктор/деструктор, есть операция — может быть перегружена и так далее. Это уменьшает объем кода, но дизассемблерный листинг то остается один и тот же (я утирирую) — а значит на одну строчку кода в С++ приходиться больше информации, чем в С. А значит он на некую абстрактную производную от этой информации сложней.
да, язык больше, я не спорю.
но посмотрите на это с другой стороны: какая-либо возможность языка учится один раз, а потом используется многократно, если нет этой возможности то пришлось бы постоянно писать однотипный код.
1>Это безусловно довольно субъективный подход — но согласитесь, у разных людей разные вкусы. Кому то нравиться одно, кому то другое. Поэтому людям которые предпочитают чистый Си с вами согласиться тяжело — для них меньше кода отнюдь не значит безопасней и стопроцентно не значит легче.
не, я не спорю, у людей может быть субъективное, ошибочное мнение
1>Ну и насчет безопастности — все таки это больше зависит от опыта. Я вот в коде допустил такую дуратскую ошибку, а в реальном коде как в Enter/Leave оборачиваются очень небольшие участки, внутри которых нет переходов за них. И участки эти в голове прокручиваю. А тут просто набросал как пример и даже не задумался, будет работать или нет. Хотя я склонен думать, что программист с малым опытом на С++ допустит меньше ошибок чем на С. Но только если будет следовать RAII, а не писать legacy. Но понимание всей прелести RAII приходит только с опытом.
Тут проблема в образовании, многие начинают учить C++ начиная с legacy C, приобретают вредные привычки, и часто далеко не выходят за пределы legacy C. Прочитайте статью http://www2.research.att.com/~bs/new_learning.pdf — мне понравилось.
Здравствуйте, Alexéy Sudachén, Вы писали:
AS>С примером, в котором очевидно где 'видно что безопасней и легче', когда тыкать будешь?!
я уже привёл пример с тремя ресурсами.
AS>А то мне прям как-то интересно даже. Чувствую во мне тролль просыпается и жрать хочет.
сейчас будет рок-н-ролл
AS>Надо ещё наверное C-стайл пример с сортировкой привести, шоб ваще весело стало )))) Хотя не, давай сначала с управлением ресурсами разберёмся.
Здравствуйте, Alexéy Sudachén, Вы писали:
AS>Ну, по причине неадекватной сложности, ведущей к постоянной борьбе с языком, и постоянного вынужденного скатывания к синтаксическому онанизму. Плюс к тому ещё и высокая сложности разбора крешей в случае использования 'правильных' либ.
AS>Привело к серьёзному упрощению кода, который теперь можно понять не изучая в течении нескольких лет методы высокой магии и прорицания в пространствах синтаксических подсластителей.
Синтаксический онанизм говоришь? методы высокой магии? прорицание в пространствах синтаксических подсластителей? серьёзное упрощение кода?
ну-ну :
#define __Auto_Release \
switch ( 0 ) \
if ( 0 ); else \
while ( 1 ) \
if ( 1 ) \
{ \
int YOYO_LOCAL_ID(Mark); \
Yo_Unwind_Scope(0,0,&YOYO_LOCAL_ID(Mark)); \
break; \
case 0: Yo_Pool_Ptr(&YOYO_LOCAL_ID(Mark),Yo_Pool_Marker_Tag); \
goto YOYO_LOCAL_ID(Body);\
} \
else \
YOYO_LOCAL_ID(Body):
Здравствуйте, MasterZiv, Вы писали:
MZ>On 05/10/2012 07:41 PM, org_256 wrote:
>> P>Так что быстрее? std::sort (C++ style) vs qsort (C-style) ? >> Они идентичны, если речь идёт о стандарте, Если не стандарт, то некоторые >> реализации qsort сливают.
MZ>Как бы ты не прав. Они НЕ идентичны. С++ный шаблоный код потенциально MZ>быстрее, т.к. там возможно встраивание кода функции сравнения, и MZ>прочие оптимизации, отсюда вытекающие. Также С++ный код знает MZ>ТИП массива, а С-шный -- не знает. Тоже могут быть оптимизации.
MZ>Конечно, С-шный код в принципе тоже может это соптимизнуть, MZ>но только это должен быть ОЧЕНЬ умный компилятор.
>> При этом std::sort в ряде реализаций был с косяками...
MZ>Ну, это проблема не языка, а конкретной реализации. MZ>Но я лично такого не слышал никогда.
Я позволил себе объединить часть суждений, а то их стало слишком много.
P>>>>>а чем принципиально indirect call отличается от virtual call в контексте runtime decision? и то и то получается посредством усилий разработчика 1>>>>В С эти усилия всегда в явном виде. С++ можно и без усилий получить их по дефолту. Проще говоря на чистом Си тормоза всегда являются результатом осознанного решения разработчика. Только то и всего. P>>>а где в C++ их можно получить по дефолту, да так чтобы не знать об этом? P>>>я когда пишу virtual — всегда осознаю, что в 99% случаев это будет indirect call через vtable 1>>Сама концепция объекта как черного ящика их предполагает. P>поясните что именно вы имеете ввиду, в данном контексте
То что сама концепция ООП с классами как черными ящиками подразумевает неизвестность будут тормоза или нет. Это "детали скрытые конкретной реализацией". Одновременно и ирония и правда.
P>>>>>или вы имеете ввиду то, что для любого C++ кода можно написать аналогичный C код? если да, то я и не спорю — да можно, есть даже авто трансляторы с C++ на C. вот только размер аналогичного С кода будет не меньше, а в большинстве случаев больше в разы. 1>>>>Нет. Я имею в виду, что получить максимальную скорость в плюсах можно используя для критичных участков кода чистый Си. Если вместо вызова std::sort вы напишите быстрою сортировку на си, она будет работать быстрей. P>>>надо попробовать в эту ручную сортировку привести к интерфейсу std::sort, может разность в скорости обуславливается разными алгоритмами? 1>>Разница обусловлена только тем, что std::sort будучи функцией с большей функциональностью (в плане данных над которыми она применяется) за эту функциональность платит скоростью. Более общее решение всегда медленней частного. P>Вы видели P>template <class RandomAccessIterator> P>void qSortIT(RandomAccessIterator first, RandomAccessIterator last) P>? P>как сильно оно отличается по функциональности от std::sort? P>Может всё-таки дело в разных алгоритмах? std::sort это ведь не обязательно quicksort
Ниже. В самом конце.
1>>Я честно сказать не совсем улавливаю о чем мы спорим: С++ даст более компактный код. С даст более быстрый код. С++ со вставками legacy в нужных местах даст скорость, во всех остальных — компактность. P>нет. при использовании шаблонов, при определении специализаций для небольших особенностей, при определении алгоритмов которые принимают сущности с большим набором небольших особенностей, полный код алгоритма учитывающий каждую особенность сгенерируется автоматом, и будет он не медленней, а то и быстрее legacy C, так как вручную все эти особенности учесть на несколько порядков труднее.
Практический пример в коде. Если вы ознакомитесь с дизассемблерным листингом — то все эти вопросы исчезнут. 1>>Если пропихнуть вместо legacy С asm — будет ещё быстрей (если конечно есть опыт программирования на нем и время на профайлер). P>это тоже заблуждение, компиляторы сейчас обладают большими знаниями в оптимизации, чем люди. P>если речь идёт о расширениях типа sse — то во-первых, сейчас компиляторы умеют делать автовекторизацию, во-вторых если всё-же придётся использовать sse вручную, то это будет не asm, а intrinsic, и в-третьих эти intrinsic при грамотном дизайне не будут разбросаны по всему проекту, а будут аккуратно обвёрнуты в маленькие абстракции. P>Пример, http://eigen.tuxfamily.org/index.php?title=Main_Page — см раздел "Eigen is fast" P>Тесты: http://eigen.tuxfamily.org/index.php?title=Benchmark как видите, Eigen уделывает legacy код на многих участках. P>Так что миф об legacy speed — это миф.
Тесты аудио/видеодекодеров с вами не согласны. Сравнение скорости крипто алгоритмов тоже. Как раз таки тесты не показатель — их можно подогнать под что угодно.
Ну а насчет мифа — достаточно взглянуть во внутренности математических библиотек Intel'а, чтобы убедиться, как глубоко заблуждаются инженеры этой компании. Люди умней компиляторов.
1>>>>Ещё раз — qsort, это быстрая сортировка на Си для произвольных структур. Она заведомо проигранная в скорости. Осознанный выбор, когда в этом месте программы на её скорость можно наплевать. 1>>>>Да размер кода будет больше. Я собственно везде об этом и говорю. Лично для меня основное преимущество С++, когда я использую его, вместо С — это объем кода. P>>>ну да, на С можно сделать тоже самое, но кода почти всегда будет больше. И вот этот дополнительный код на C, который автоматом генерируется на C++, зачастую и не пишется. 1>>Да вы правы. Но у меня сложилась мнение, что вы считаете это только недостатком. Я же полагаю, что иногда это недостаток, а иногда достоинство. P>Почему достоинство? P>Перед чем достоинство? — на C++ возможны оба подхода, а на C по большому счёту только один
В С++ есть один правильный подход и возможность пользоваться неправильным. Но Неправильный подход — это и есть С.
1>>>>>>std::sort будет медленней алгоритма сортировки для double*. P>>>>>вы имеете ввиду специальные алгоритмы (типа Radix sort) отличные от quicksort? P>>>>>ну так C++ и в этом месте лучше — можно сделать специализацию для double*, либо вообще для T* — причём интерфейс не поменяется. 1>>>>Да нет же. И шаблоны я знаю. 1>>>>>>C++ выигрывает в скорости при одинаковом объеме кода, проигрывает при разном. P>>>>>вы имеете ввиду использование специальных алгоритмов, для специальных случаев? 1>>>>Нет. P>>>я просто пытался понять, что вы имели ввиду... 1>>В коде образец. Я постараюсь объяснить, если вы сформулируете вопрос. P>Понимаете, для сортировки есть разные алгоритмы, разные реализации std::sort
Ну я то тут причем? Это вы ведь приводите исследование их сравнивающее. Причем уже во второй раз. На Си там быстрая сортировка.
1>>>>>>Если хотите скину код, состряпанный на скорую руку. P>>>>>если не трудно — то скиньте, мне будет интересно. можно сюда, а можно в http://ideone.com/ 1>>>>http://pastebin.com/YsGRBtZ0 — только #include "stdafx.h" уберите, я забыл 1>>>>http://ideone.com/iL6Gb 1>>>>На скорую рука, так что не очень, но общий подход иллюстрирует. P>>>http://pastebin.com/QXPU0zWC P>>>test_c2 и test_cplusplus3 по скорости примерно одинаковы. 1>>На N=100000000, qsort: 28.758331, std::sort: 20.791297, c: 17.333931 соотношение 1,38 и 1,199 1>>На N=10000000 qsort: 2.567289, std::sort: 1.824936, c: 1.510803 соотношение 1,40 и 1,20 1>>т.е. то о чем я говорю: переписывания куска кода на чистый с раздуло этот код и ускорило его работу на ~20 процентов. В два раза меньше чем использование std::sort вместо qsort — так что цифры увеличения скорости вполне сопоставимы. 1>>Единственный момент: это 64 разрядный код, std::sort при N=100000000 на 32 битах вылетело с исключением)). Для 32 qsort vs std::sort получается в районе 1,6. P>Вы видели test_cplusplus3 ????? У вас там есть разница в скорости?
Опечатался. Разумеется просто "test_cplusplus". Разница в скорости есть, код у вас есть — можите сравнить. P>Кстати, сравнивать сортировку на разных наборах случайных данных не корректно, на определённых данных quicksort вообще может взрываться до N^2.
Но quicksort там это Си. Что на С++ как вы сами сказали — неизвестно. И что значит случайные сравнивать некорректно — да есть алгоритмы, работающие быстрей при увеличении степени упорядоченности. Но сортировка предназначенная для упорядочивания не упорядоченного массива в том числе и случайных данных (пусть это и худший случай). На чем её ещё тестировать — на возрастающем массиве? Впрочем я не имею ничего против, если вы поменяете способ наполнения массива и скинете код.
1>>>>>>Для qsort кстати функция сравнения не инлайница P>>>>>браво 1>>>>Я обратил ваше внимание на то, почему в приведенном вами сравнении выигрывает С++. И как это исправить. P>>>да, именно, не инлайница/indirect call это основные факты почему быстрее.. 1>>Но неинлайница, потому как qsort — функция "обобщенная". И по факту в коде она не используется. Ну как wchar_t под unix. Наверное самая близкая аналогия. P>ну std::sort ведь тоже обобщённая, и при этом всё инлайнится
Я взял в кавычки слово обобщенная, потому, что обобщенная в С++ — это объявленная через шаблон(ы). В данном случа я имел в виду, предназначенная под любые типы данных.
1>>>>И? Померились? P>>>?? я с вами мерится не собирался, мне интересно сравнение C vc C++, без личностей... 1>>Извините, если восприняли, как переход на личности (хотя подтекст не скрою)) ). Просто очевидно, что С предоставляет меньшие возможности по инициализации/освобождению ресурсов и в подобных сравнениях кода на С будет больше, чем на плюсах. P>я думаю при создании функции с 10 ресурсами, как минимум большинство программистов сделает ошибку, а то и не одну. P>Зачем вообще надрываться и использовать C, когда есть C++? (естественно, кроме тех случаев когда использование C++ невозможно из-за отсутствия компилятора)
Как минимум у разных людей разные предпочтения. Ну действительно — зачем надрываться и сажать картошку, если можно есть саранчу, которая сама вырастит.
1>>Особенно если классы выносить из описания)). P>ну так в этом и смысл, в C++ управление ресурсом можно сделать один раз, и потом использовать многократно. В C такое вынесение практически не возможно (многоэтажные макросы не в счёт), и приходится постоянно тратить время на контроль ресурсов
В си управление ресурсом выноситься в соответствующею ресурсу функцию. Больше кода получается, потому как эту функцию надо вызвать руками и проверить результат её вызова. В итоге вместо одной строчки на С++ для объявления и одновременной инициализации мы получаем две. Для объявления, инициализации и проверки (две операции из этих операций логично объединить в одну).
1>>Поэтому я лично слабо улавливаю, что вы хотите показать этим сравнением. Код на С++ компактней. Ну так в этом то наши мнения совпадают. P>далеко не все это понимают. P>помимо компактности — это ещё и безопасность и надёжность.
Я об этом уже написал. Печально, что вы не захотели понять, что кто то может иметь точку зрения отличающеюся от вашей и пытаетесь убедить других в своей точке зрения.
1>>Я кстати как то не обращал внимания на такой способ захвата объектов синхронизации, так что спасибо за ваш пример. P>рад что вам это пригодится. это касается любых ресурсов.
P>>>>>Я думаю даже без причёсывания вашего C-style варианта, видно что безопасней и легче. 1>>>>Чем меряете безопасность и легкость кода? Всетаки субъективные критерии. Помимо наличия конструкторов и деструкторов. P>>>легкость: кода меньше. код лаконичней. вообще не надо парится об корректном сборе ресурсов. P>>>безопасность: кода меньше. код лаконичней. вообще не надо парится об корректном сборе ресурсов. P>>>вы в своём коде сделали ошибку, я думаю наверняка не одну. проблема не в вас, а в самом подходе, я бы тоже сделал ошибку в вашем случае, потому что код намного сложнее. 1>>Отчасти я с вами согласен. Но и вы отнеситесь с пониманием: С язык очень простой. Фактически — простыня вызова функций. Поэтому когда сложный алгоритм предварительно просчитан, разбит на составляющие, использование си приводит к тупому переносу алгоритма с одного языка на другой. И это тоже уменьшает ошибки. Да на С++ кода меньше и он лаконичней, но это достигается его большей информационной емкостью, а значит повышает сложность. Смотрите сами: есть класс — значит есть конструктор/деструктор, есть операция — может быть перегружена и так далее. Это уменьшает объем кода, но дизассемблерный листинг то остается один и тот же (я утирирую) — а значит на одну строчку кода в С++ приходиться больше информации, чем в С. А значит он на некую абстрактную производную от этой информации сложней. P>да, язык больше, я не спорю. P>но посмотрите на это с другой стороны: какая-либо возможность языка учится один раз, а потом используется многократно, если нет этой возможности то пришлось бы постоянно писать однотипный код.
И при этом не все сопутствующие последствия человек удерживает в голове. Это как раз одна из причин, по которой люди иногда предпочитают чистый С.
1>>Это безусловно довольно субъективный подход — но согласитесь, у разных людей разные вкусы. Кому то нравиться одно, кому то другое. Поэтому людям которые предпочитают чистый Си с вами согласиться тяжело — для них меньше кода отнюдь не значит безопасней и стопроцентно не значит легче. P>не, я не спорю, у людей может быть субъективное, ошибочное мнение
Ну я сомневаюсь, что есть идеальные люди с объективным и единственно верным мнением. Хотя это конечно немного самоуверенно)) 1>>Ну и насчет безопастности — все таки это больше зависит от опыта. Я вот в коде допустил такую дуратскую ошибку, а в реальном коде как в Enter/Leave оборачиваются очень небольшие участки, внутри которых нет переходов за них. И участки эти в голове прокручиваю. А тут просто набросал как пример и даже не задумался, будет работать или нет. Хотя я склонен думать, что программист с малым опытом на С++ допустит меньше ошибок чем на С. Но только если будет следовать RAII, а не писать legacy. Но понимание всей прелести RAII приходит только с опытом. P>Тут проблема в образовании, многие начинают учить C++ начиная с legacy C, приобретают вредные привычки, и часто далеко не выходят за пределы legacy C. Прочитайте статью http://www2.research.att.com/~bs/new_learning.pdf — мне понравилось.
Тут проблема в том что С проще и его проще учить. Ну или по крайней мере так полагает большинство авторов.
Насчет статьи:
Я не перепечатывал код полностью — но пример данный мной в прошлом сообщении взят именно из этой статьи. И он хорошо показывает, что статья не в полне объективна. Она показывает выигрыш С++ в скорости над С. Но написав сишный код чуть-чуть подругому мы получаем диаметрально противоположный результат. Мне очень не нравиться попытка сравнить std::sort и qsort. Как я уже сказал, qsort — это нечто вроде wchar_t под unix. Да она есть — но ей в большинстве случаев не пользуются. И она априорно медленней std::sort — что там можно сравнивать, тестировать и как на основе этого теста можно говорить, что С++ быстрей. И утверждение, что более высокий уровень абстракции и защиты от ошибок при этом дает увеличение скорости не лезет ни в какие ворота.
Здравствуйте, 11molniev, Вы писали:
P>>>>>>а чем принципиально indirect call отличается от virtual call в контексте runtime decision? и то и то получается посредством усилий разработчика 1>>>>>В С эти усилия всегда в явном виде. С++ можно и без усилий получить их по дефолту. Проще говоря на чистом Си тормоза всегда являются результатом осознанного решения разработчика. Только то и всего. P>>>>а где в C++ их можно получить по дефолту, да так чтобы не знать об этом? P>>>>я когда пишу virtual — всегда осознаю, что в 99% случаев это будет indirect call через vtable 1>>>Сама концепция объекта как черного ящика их предполагает. P>>поясните что именно вы имеете ввиду, в данном контексте 1>То что сама концепция ООП с классами как черными ящиками подразумевает неизвестность будут тормоза или нет. Это "детали скрытые конкретной реализацией". Одновременно и ирония и правда.
тоже самое можно сказать о функции — вот смотришь на декларацию — и не поймёшь — будут тормоза или нет.
1>>>Я честно сказать не совсем улавливаю о чем мы спорим: С++ даст более компактный код. С даст более быстрый код. С++ со вставками legacy в нужных местах даст скорость, во всех остальных — компактность. P>>нет. при использовании шаблонов, при определении специализаций для небольших особенностей, при определении алгоритмов которые принимают сущности с большим набором небольших особенностей, полный код алгоритма учитывающий каждую особенность сгенерируется автоматом, и будет он не медленней, а то и быстрее legacy C, так как вручную все эти особенности учесть на несколько порядков труднее. 1>Практический пример в коде. Если вы ознакомитесь с дизассемблерным листингом — то все эти вопросы исчезнут. 1>>>Если пропихнуть вместо legacy С asm — будет ещё быстрей (если конечно есть опыт программирования на нем и время на профайлер). P>>это тоже заблуждение, компиляторы сейчас обладают большими знаниями в оптимизации, чем люди. P>>если речь идёт о расширениях типа sse — то во-первых, сейчас компиляторы умеют делать автовекторизацию, во-вторых если всё-же придётся использовать sse вручную, то это будет не asm, а intrinsic, и в-третьих эти intrinsic при грамотном дизайне не будут разбросаны по всему проекту, а будут аккуратно обвёрнуты в маленькие абстракции. P>>Пример, http://eigen.tuxfamily.org/index.php?title=Main_Page — см раздел "Eigen is fast" P>>Тесты: http://eigen.tuxfamily.org/index.php?title=Benchmark как видите, Eigen уделывает legacy код на многих участках. P>>Так что миф об legacy speed — это миф. 1>Тесты аудио/видеодекодеров с вами не согласны. Сравнение скорости крипто алгоритмов тоже.
какие именно тесты?
что там сравнивается? быстрая реализация на C versus плохая C++ реализация?
1>Как раз таки тесты не показатель — их можно подогнать под что угодно.
Вы посмотрите что сравнивается на графиках: вылизанные реализации типа GOTO2, INTEL_MKL, versus Eigen. Разве это не честно? Или вы сомневаетесь в чистоте тестов?
1>Ну а насчет мифа — достаточно взглянуть во внутренности математических библиотек Intel'а, чтобы убедиться, как глубоко заблуждаются инженеры этой компании.
какие именно библиотеки вы имеете ввиду?
И какие там внутренности? Разве ассемблер?
1>Люди умней компиляторов.
на счёт этого я не спорю.
Компиляторы могут обработать намного большие объёмы информации чем люди, они знают намного больше об процессорах, pipelines и т.п.
Простое переписывание вручную на ассемблер ничего не даст, а зачастую наоборот замедлит.
Многие верят в миф, что просто ручное написание на ассемблере даст ускорение — это bullshit. Простого переписывания не достаточно для обгона компилятора.
P>>Понимаете, для сортировки есть разные алгоритмы, разные реализации std::sort 1>Ну я то тут причем? Это вы ведь приводите исследование их сравнивающее. Причем уже во второй раз. На Си там быстрая сортировка.
я согласен, просто сравнение скорости std::sort и qsort из какой-нибудь реализации не полностью честно.
Но, идея в том, что если взять одинаковые алгоритмы, один из которых обвернуть в qsort, другой в std::sort, std::sort будет быстрее.
1>>>>>>>Если хотите скину код, состряпанный на скорую руку. P>>>>>>если не трудно — то скиньте, мне будет интересно. можно сюда, а можно в http://ideone.com/ 1>>>>>http://pastebin.com/YsGRBtZ0 — только #include "stdafx.h" уберите, я забыл 1>>>>>http://ideone.com/iL6Gb 1>>>>>На скорую рука, так что не очень, но общий подход иллюстрирует. P>>>>http://pastebin.com/QXPU0zWC P>>>>test_c2 и test_cplusplus3 по скорости примерно одинаковы. 1>>>На N=100000000, qsort: 28.758331, std::sort: 20.791297, c: 17.333931 соотношение 1,38 и 1,199 1>>>На N=10000000 qsort: 2.567289, std::sort: 1.824936, c: 1.510803 соотношение 1,40 и 1,20 1>>>т.е. то о чем я говорю: переписывания куска кода на чистый с раздуло этот код и ускорило его работу на ~20 процентов. В два раза меньше чем использование std::sort вместо qsort — так что цифры увеличения скорости вполне сопоставимы. 1>>>Единственный момент: это 64 разрядный код, std::sort при N=100000000 на 32 битах вылетело с исключением)). Для 32 qsort vs std::sort получается в районе 1,6. P>>Вы видели test_cplusplus3 ????? У вас там есть разница в скорости? 1>Опечатался. Разумеется просто "test_cplusplus". Разница в скорости есть, код у вас есть — можите сравнить.
Вы видели test_cplusplus3 (цифра три на конце) ? выделенная жирным ссылка на pastebin
P>>Кстати, сравнивать сортировку на разных наборах случайных данных не корректно, на определённых данных quicksort вообще может взрываться до N^2. 1>Но quicksort там это Си. Что на С++ как вы сами сказали — неизвестно. И что значит случайные сравнивать некорректно — да есть алгоритмы, работающие быстрей при увеличении степени упорядоченности. Но сортировка предназначенная для упорядочивания не упорядоченного массива в том числе и случайных данных (пусть это и худший случай). На чем её ещё тестировать — на возрастающем массиве? Впрочем я не имею ничего против, если вы поменяете способ наполнения массива и скинете код.
Вы не поняли меня. В ваших тестах (да и в тех что я добавил, основываясь на вашем подходе), производится сравнение скорости сортировки на разных случайных наборах. А нужно делать сравнение на одинаковых, но при это всё равно случайных наборах.
1>>>>>И? Померились? P>>>>?? я с вами мерится не собирался, мне интересно сравнение C vc C++, без личностей... 1>>>Извините, если восприняли, как переход на личности (хотя подтекст не скрою)) ). Просто очевидно, что С предоставляет меньшие возможности по инициализации/освобождению ресурсов и в подобных сравнениях кода на С будет больше, чем на плюсах. P>>я думаю при создании функции с 10 ресурсами, как минимум большинство программистов сделает ошибку, а то и не одну. P>>Зачем вообще надрываться и использовать C, когда есть C++? (естественно, кроме тех случаев когда использование C++ невозможно из-за отсутствия компилятора) 1>Как минимум у разных людей разные предпочтения. Ну действительно — зачем надрываться и сажать картошку, если можно есть саранчу, которая сама вырастит.
тут я не спорю — вкусы у всех разные.
Но, зачастую "отрекание" от C++ в сторону C, происходит на основе неправильной интерпретации опыта.
1>>>Поэтому я лично слабо улавливаю, что вы хотите показать этим сравнением. Код на С++ компактней. Ну так в этом то наши мнения совпадают. P>>далеко не все это понимают. P>>помимо компактности — это ещё и безопасность и надёжность. 1>Я об этом уже написал. Печально, что вы не захотели понять, что кто то может иметь точку зрения отличающеюся от вашей и пытаетесь убедить других в своей точке зрения.
Я помню что вы писали, я понял что вы имели ввиду, но ни один coding standard, никогда не будет лучше отсутствия технической возможности ошибиться.
P>>>>>>Я думаю даже без причёсывания вашего C-style варианта, видно что безопасней и легче. 1>>>>>Чем меряете безопасность и легкость кода? Всетаки субъективные критерии. Помимо наличия конструкторов и деструкторов. P>>>>легкость: кода меньше. код лаконичней. вообще не надо парится об корректном сборе ресурсов. P>>>>безопасность: кода меньше. код лаконичней. вообще не надо парится об корректном сборе ресурсов. P>>>>вы в своём коде сделали ошибку, я думаю наверняка не одну. проблема не в вас, а в самом подходе, я бы тоже сделал ошибку в вашем случае, потому что код намного сложнее. 1>>>Отчасти я с вами согласен. Но и вы отнеситесь с пониманием: С язык очень простой. Фактически — простыня вызова функций. Поэтому когда сложный алгоритм предварительно просчитан, разбит на составляющие, использование си приводит к тупому переносу алгоритма с одного языка на другой. И это тоже уменьшает ошибки. Да на С++ кода меньше и он лаконичней, но это достигается его большей информационной емкостью, а значит повышает сложность. Смотрите сами: есть класс — значит есть конструктор/деструктор, есть операция — может быть перегружена и так далее. Это уменьшает объем кода, но дизассемблерный листинг то остается один и тот же (я утирирую) — а значит на одну строчку кода в С++ приходиться больше информации, чем в С. А значит он на некую абстрактную производную от этой информации сложней. P>>да, язык больше, я не спорю. P>>но посмотрите на это с другой стороны: какая-либо возможность языка учится один раз, а потом используется многократно, если нет этой возможности то пришлось бы постоянно писать однотипный код. 1>И при этом не все сопутствующие последствия человек удерживает в голове. Это как раз одна из причин, по которой люди иногда предпочитают чистый С.
почему в этом случае не использовать тот subset C++, который понятен, и удерживается в голове?
1>>>Ну и насчет безопастности — все таки это больше зависит от опыта. Я вот в коде допустил такую дуратскую ошибку, а в реальном коде как в Enter/Leave оборачиваются очень небольшие участки, внутри которых нет переходов за них. И участки эти в голове прокручиваю. А тут просто набросал как пример и даже не задумался, будет работать или нет. Хотя я склонен думать, что программист с малым опытом на С++ допустит меньше ошибок чем на С. Но только если будет следовать RAII, а не писать legacy. Но понимание всей прелести RAII приходит только с опытом. P>>Тут проблема в образовании, многие начинают учить C++ начиная с legacy C, приобретают вредные привычки, и часто далеко не выходят за пределы legacy C. Прочитайте статью http://www2.research.att.com/~bs/new_learning.pdf — мне понравилось. 1>Тут проблема в том что С проще и его проще учить. Ну или по крайней мере так полагает большинство авторов.
в статье как раз говорится что C++ легче учить (хотя бы до определённого уровня)
1>Насчет статьи: 1>Я не перепечатывал код полностью — но пример данный мной в прошлом сообщении взят именно из этой статьи. И он хорошо показывает, что статья не в полне объективна. Она показывает выигрыш С++ в скорости над С. Но написав сишный код чуть-чуть подругому мы получаем диаметрально противоположный результат.
сравниваются две "обобщённые"(как вы сами сказали). да, алгоритмы сортировки в реализации могут быть разные, но давайте возьмём один алгоритм, ок?
Вы написали не обобщённую C версию, при этом когда я из неё сделал на C++ обобщённую — qSortIT, её скорость была не меньше скорости не обобщённой C версии — вы это увидели?
1>Мне очень не нравиться попытка сравнить std::sort и qsort. Как я уже сказал, qsort — это нечто вроде wchar_t под unix. Да она есть — но ей в большинстве случаев не пользуются. И она априорно медленней std::sort — что там можно сравнивать, тестировать и как на основе этого теста можно говорить, что С++ быстрей. И утверждение, что более высокий уровень абстракции и защиты от ошибок при этом дает увеличение скорости не лезет ни в какие ворота.
почему, по-моему как раз таки лезет.
1) есть две обощённые(в вашем понимании функции) qsort и std::sort
2) интерфейс std::sort более безопасен и менее подвержен ошибкам чем qsort
3) при равный используемых алгоритмах сортировки std::sort будет быстрее qsort
Здравствуйте, RSATom, Вы писали:
P>>А зачем вообще может понадобится использовать C, когда есть C++ ? RSA>Существуют Open Source проекты написаные на с99, иногда хочется их портировать под винду для использования в каких либо проектах. Яркий пример ffmpeg.
да, согласен, это тоже аргумент.
но естественно в большинстве случаев ни что не мешает использовать нормальную C библиотеку из C++, в остальных нужен простой переходник написанный на C.
Здравствуйте, Piko, Вы писали:
P>Здравствуйте, RSATom, Вы писали:
P>>>А зачем вообще может понадобится использовать C, когда есть C++ ? RSA>>Существуют Open Source проекты написаные на с99, иногда хочется их портировать под винду для использования в каких либо проектах. Яркий пример ffmpeg.
P>да, согласен, это тоже аргумент. P>но естественно в большинстве случаев ни что не мешает использовать нормальную C библиотеку из C++, в остальных нужен простой переходник написанный на C.
Я немного про другое — поскольку c99 проект не собрать в студии, значит придется использовать gcc для компиляции с99 кода, а gcc не умеет создавать отладочную информацию которую умеет понимать студия. и тут вариантов несколько:
1) реализовывать весь проект на gcc (ИМХО особый род мазохизма при наличии студии);
2) использовать студию для отладки/написания с++ кода и gcc/gdb для отладки с99 кода, при таком подходе отладка на стыке компиляторов превращается в достаточно увлекательный квест;
3) портирование с99 кода в с++ — квест получаем увлекательный и итеративный, т.к. нужно отрабатывать выход новых версий и bug/security фиксы.
*) другие не очень привлекательные варианты.
Здравствуйте, RSATom, Вы писали:
P>>>>А зачем вообще может понадобится использовать C, когда есть C++ ? RSA>>>Существуют Open Source проекты написаные на с99, иногда хочется их портировать под винду для использования в каких либо проектах. Яркий пример ffmpeg. P>>да, согласен, это тоже аргумент. P>>но естественно в большинстве случаев ни что не мешает использовать нормальную C библиотеку из C++, в остальных нужен простой переходник написанный на C. RSA>Я немного про другое — поскольку c99 проект не собрать в студии,
ясно. насколько я помню microsoft не стремится реализовывать "новые фишки" стандартов C, только то что пересекается с новыми фишками C++.
как сказал Страуструп — следует смёрджить C / C++ в один язык, C is obsolete
RSA>значит придется использовать gcc для компиляции с99 кода, а gcc не умеет создавать отладочную информацию которую умеет понимать студия. и тут вариантов несколько:
RSA>1) реализовывать весь проект на gcc (ИМХО особый род мазохизма при наличии студии); RSA>2) использовать студию для отладки/написания с++ кода и gcc/gdb для отладки с99 кода, при таком подходе отладка на стыке компиляторов превращается в достаточно увлекательный квест; RSA>3) портирование с99 кода в с++ — квест получаем увлекательный и итеративный, т.к. нужно отрабатывать выход новых версий и bug/security фиксы. RSA>*) другие не очень привлекательные варианты.
ещё возможные варианты (я их не тестировал, полностью не уверен):
4) Intel C вроде понимает C99, и не плохо интегрируется со студией
5) CLang/LLVM
6) автотрансляция кода с С99 в более старую версию
Здравствуйте, Piko, Вы писали:
P>Здравствуйте, 11molniev, Вы писали:
P>>>>>>>а чем принципиально indirect call отличается от virtual call в контексте runtime decision? и то и то получается посредством усилий разработчика 1>>>>>>В С эти усилия всегда в явном виде. С++ можно и без усилий получить их по дефолту. Проще говоря на чистом Си тормоза всегда являются результатом осознанного решения разработчика. Только то и всего. P>>>>>а где в C++ их можно получить по дефолту, да так чтобы не знать об этом? P>>>>>я когда пишу virtual — всегда осознаю, что в 99% случаев это будет indirect call через vtable 1>>>>Сама концепция объекта как черного ящика их предполагает. P>>>поясните что именно вы имеете ввиду, в данном контексте 1>>То что сама концепция ООП с классами как черными ящиками подразумевает неизвестность будут тормоза или нет. Это "детали скрытые конкретной реализацией". Одновременно и ирония и правда. P>тоже самое можно сказать о функции — вот смотришь на декларацию — и не поймёшь — будут тормоза или нет.
Дык функция то и есть конкретная реализация)) Ничего не скрывается за абстракцией)) Я говорю о том, что в случае с ООП сама парадигма противоречит "я когда пишу virtual — всегда осознаю, что в 99% случаев это будет indirect call через vtable". Ничего более.
1>>>>Я честно сказать не совсем улавливаю о чем мы спорим: С++ даст более компактный код. С даст более быстрый код. С++ со вставками legacy в нужных местах даст скорость, во всех остальных — компактность. P>>>нет. при использовании шаблонов, при определении специализаций для небольших особенностей, при определении алгоритмов которые принимают сущности с большим набором небольших особенностей, полный код алгоритма учитывающий каждую особенность сгенерируется автоматом, и будет он не медленней, а то и быстрее legacy C, так как вручную все эти особенности учесть на несколько порядков труднее. 1>>Практический пример в коде. Если вы ознакомитесь с дизассемблерным листингом — то все эти вопросы исчезнут. 1>>>>Если пропихнуть вместо legacy С asm — будет ещё быстрей (если конечно есть опыт программирования на нем и время на профайлер). P>>>это тоже заблуждение, компиляторы сейчас обладают большими знаниями в оптимизации, чем люди. P>>>если речь идёт о расширениях типа sse — то во-первых, сейчас компиляторы умеют делать автовекторизацию, во-вторых если всё-же придётся использовать sse вручную, то это будет не asm, а intrinsic, и в-третьих эти intrinsic при грамотном дизайне не будут разбросаны по всему проекту, а будут аккуратно обвёрнуты в маленькие абстракции. P>>>Пример, http://eigen.tuxfamily.org/index.php?title=Main_Page — см раздел "Eigen is fast" P>>>Тесты: http://eigen.tuxfamily.org/index.php?title=Benchmark как видите, Eigen уделывает legacy код на многих участках. P>>>Так что миф об legacy speed — это миф. 1>>Тесты аудио/видеодекодеров с вами не согласны. Сравнение скорости крипто алгоритмов тоже. P>какие именно тесты?
Не тесты, сами кодеки. P>что там сравнивается? быстрая реализация на C versus плохая C++ реализация?
Обе реализации от авторов. Так сказать официальные. А ваши слова про быструю/плохую реализации как раз говорят, что тестам верить нельзя. О том и речь. 1>>Как раз таки тесты не показатель — их можно подогнать под что угодно. P>Вы посмотрите что сравнивается на графиках: вылизанные реализации типа GOTO2, INTEL_MKL, versus Eigen. Разве это не честно? Или вы сомневаетесь в чистоте тестов?
Да сомневаюсь. Я полагаю, что INTEL_MKL быстрей. И я абсолютна точно знаю, что тесты можно подогнать к чему угодно. Сам видел сравнения в которых Java быстрей C++. 1>>Ну а насчет мифа — достаточно взглянуть во внутренности математических библиотек Intel'а, чтобы убедиться, как глубоко заблуждаются инженеры этой компании. P>какие именно библиотеки вы имеете ввиду? P>И какие там внутренности? Разве ассемблер?
Смотря в каких. В упомянутой INTEL_MKL насколько помню — да. 1>>Люди умней компиляторов. P>на счёт этого я не спорю. P>Компиляторы могут обработать намного большие объёмы информации чем люди, они знают намного больше об процессорах, pipelines и т.п.
Знания компилятора о процессорах, кеш линиях и прочем сильно ограничены реализованными алгоритмами оптимизации. P>Простое переписывание вручную на ассемблер ничего не даст, а зачастую наоборот замедлит.
Ну дык смотря кто переписывает. P>Многие верят в миф, что просто ручное написание на ассемблере даст ускорение — это bullshit. Простого переписывания не достаточно для обгона компилятора.
Да просто недостаточно. Надо ещё думать головой, иметь соответствующий опыт, хоть минимальные знания и пользоваться профайлером — и тогда код будет быстрей.
P>>>Понимаете, для сортировки есть разные алгоритмы, разные реализации std::sort 1>>Ну я то тут причем? Это вы ведь приводите исследование их сравнивающее. Причем уже во второй раз. На Си там быстрая сортировка. P>я согласен, просто сравнение скорости std::sort и qsort из какой-нибудь реализации не полностью честно. P>Но, идея в том, что если взять одинаковые алгоритмы, один из которых обвернуть в qsort, другой в std::sort, std::sort будет быстрее.
Но это си. Здесь нельзя ничего обернуть не получив проигрыша в скорости. Но если взять одинаковые алгоритмы, хорошо написанные, то скорость либо будет одинаковой либо у С больше.
1>>>>>>>>Если хотите скину код, состряпанный на скорую руку. P>>>>>>>если не трудно — то скиньте, мне будет интересно. можно сюда, а можно в http://ideone.com/ 1>>>>>>http://pastebin.com/YsGRBtZ0 — только #include "stdafx.h" уберите, я забыл 1>>>>>>http://ideone.com/iL6Gb 1>>>>>>На скорую рука, так что не очень, но общий подход иллюстрирует. P>>>>>http://pastebin.com/QXPU0zWC P>>>>>test_c2 и test_cplusplus3 по скорости примерно одинаковы. 1>>>>На N=100000000, qsort: 28.758331, std::sort: 20.791297, c: 17.333931 соотношение 1,38 и 1,199 1>>>>На N=10000000 qsort: 2.567289, std::sort: 1.824936, c: 1.510803 соотношение 1,40 и 1,20 1>>>>т.е. то о чем я говорю: переписывания куска кода на чистый с раздуло этот код и ускорило его работу на ~20 процентов. В два раза меньше чем использование std::sort вместо qsort — так что цифры увеличения скорости вполне сопоставимы. 1>>>>Единственный момент: это 64 разрядный код, std::sort при N=100000000 на 32 битах вылетело с исключением)). Для 32 qsort vs std::sort получается в районе 1,6. P>>>Вы видели test_cplusplus3 ????? У вас там есть разница в скорости? 1>>Опечатался. Разумеется просто "test_cplusplus". Разница в скорости есть, код у вас есть — можите сравнить. P>Вы видели test_cplusplus3 (цифра три на конце) ? выделенная жирным ссылка на pastebin
Перепутал ваши и свои слова. Теперь видел. Разницы нет. Равно как и разницы между вариантом на С и на С++, за исключением возможности применения последнего к любым объектам реализующим соответствующий интерфейс. Это фактически то о чем я и говорю — на С++ можно написать код идентичный С (когда то С с классами)) ). И получить идентичную скорость. Быстрей сделать нельзя. Вот и все. При этом С++ кода будет меньше.
P>>>Кстати, сравнивать сортировку на разных наборах случайных данных не корректно, на определённых данных quicksort вообще может взрываться до N^2. 1>>Но quicksort там это Си. Что на С++ как вы сами сказали — неизвестно. И что значит случайные сравнивать некорректно — да есть алгоритмы, работающие быстрей при увеличении степени упорядоченности. Но сортировка предназначенная для упорядочивания не упорядоченного массива в том числе и случайных данных (пусть это и худший случай). На чем её ещё тестировать — на возрастающем массиве? Впрочем я не имею ничего против, если вы поменяете способ наполнения массива и скинете код.
P>Вы не поняли меня. В ваших тестах (да и в тех что я добавил, основываясь на вашем подходе), производится сравнение скорости сортировки на разных случайных наборах. А нужно делать сравнение на одинаковых, но при это всё равно случайных наборах.
1. Это компенсируется несколькими прогонами вот и все. Получаем медиану. Нам же ведь нужна примерное соотношение скорости, а не десятые доли процента скорости.
2. У нас довольно большой массив элементов, а диапазон их изменения не настолько велик. Фактически статистика сглаживается для таких массивов.
Поэтому я позволил себе каждый раз генерировать последовательность заново.
1>>>>>>И? Померились? P>>>>>?? я с вами мерится не собирался, мне интересно сравнение C vc C++, без личностей... 1>>>>Извините, если восприняли, как переход на личности (хотя подтекст не скрою)) ). Просто очевидно, что С предоставляет меньшие возможности по инициализации/освобождению ресурсов и в подобных сравнениях кода на С будет больше, чем на плюсах. P>>>я думаю при создании функции с 10 ресурсами, как минимум большинство программистов сделает ошибку, а то и не одну. P>>>Зачем вообще надрываться и использовать C, когда есть C++? (естественно, кроме тех случаев когда использование C++ невозможно из-за отсутствия компилятора) 1>>Как минимум у разных людей разные предпочтения. Ну действительно — зачем надрываться и сажать картошку, если можно есть саранчу, которая сама вырастит. P>тут я не спорю — вкусы у всех разные. P>Но, зачастую "отрекание" от C++ в сторону C, происходит на основе неправильной интерпретации опыта.
Могу лишь развести руками. В сущности главное качественный конечный результат. И если человек не умеет правильно интерпретировать опыт — то пусть лучше пишет на С. Это будет выглядеть не так ужасно, как на С++.
1>>>>Поэтому я лично слабо улавливаю, что вы хотите показать этим сравнением. Код на С++ компактней. Ну так в этом то наши мнения совпадают. P>>>далеко не все это понимают. P>>>помимо компактности — это ещё и безопасность и надёжность. 1>>Я об этом уже написал. Печально, что вы не захотели понять, что кто то может иметь точку зрения отличающеюся от вашей и пытаетесь убедить других в своей точке зрения. P>Я помню что вы писали, я понял что вы имели ввиду, но ни один coding standard, никогда не будет лучше отсутствия технической возможности ошибиться.
В том то и дело — что у палки два конца. Отсутствие технической возможности — это ограничение которое дает и плюсы и минусы.
P>>>>>>>Я думаю даже без причёсывания вашего C-style варианта, видно что безопасней и легче. 1>>>>>>Чем меряете безопасность и легкость кода? Всетаки субъективные критерии. Помимо наличия конструкторов и деструкторов. P>>>>>легкость: кода меньше. код лаконичней. вообще не надо парится об корректном сборе ресурсов. P>>>>>безопасность: кода меньше. код лаконичней. вообще не надо парится об корректном сборе ресурсов. P>>>>>вы в своём коде сделали ошибку, я думаю наверняка не одну. проблема не в вас, а в самом подходе, я бы тоже сделал ошибку в вашем случае, потому что код намного сложнее. 1>>>>Отчасти я с вами согласен. Но и вы отнеситесь с пониманием: С язык очень простой. Фактически — простыня вызова функций. Поэтому когда сложный алгоритм предварительно просчитан, разбит на составляющие, использование си приводит к тупому переносу алгоритма с одного языка на другой. И это тоже уменьшает ошибки. Да на С++ кода меньше и он лаконичней, но это достигается его большей информационной емкостью, а значит повышает сложность. Смотрите сами: есть класс — значит есть конструктор/деструктор, есть операция — может быть перегружена и так далее. Это уменьшает объем кода, но дизассемблерный листинг то остается один и тот же (я утирирую) — а значит на одну строчку кода в С++ приходиться больше информации, чем в С. А значит он на некую абстрактную производную от этой информации сложней. P>>>да, язык больше, я не спорю. P>>>но посмотрите на это с другой стороны: какая-либо возможность языка учится один раз, а потом используется многократно, если нет этой возможности то пришлось бы постоянно писать однотипный код. 1>>И при этом не все сопутствующие последствия человек удерживает в голове. Это как раз одна из причин, по которой люди иногда предпочитают чистый С. P>почему в этом случае не использовать тот subset C++, который понятен, и удерживается в голове?
Дык так и делают. И я делаю. Я же ведь не утверждаю, что на С++ нельзя программировать и его надо выкинуть на помойку. Я только говорю, что для некоторых задач и программистов выбор С вполне оправдан. И что С++ не будет быстрей С. Он либо медленней либо равен по скорости.
1>>>>Ну и насчет безопастности — все таки это больше зависит от опыта. Я вот в коде допустил такую дуратскую ошибку, а в реальном коде как в Enter/Leave оборачиваются очень небольшие участки, внутри которых нет переходов за них. И участки эти в голове прокручиваю. А тут просто набросал как пример и даже не задумался, будет работать или нет. Хотя я склонен думать, что программист с малым опытом на С++ допустит меньше ошибок чем на С. Но только если будет следовать RAII, а не писать legacy. Но понимание всей прелести RAII приходит только с опытом. P>>>Тут проблема в образовании, многие начинают учить C++ начиная с legacy C, приобретают вредные привычки, и часто далеко не выходят за пределы legacy C. Прочитайте статью http://www2.research.att.com/~bs/new_learning.pdf — мне понравилось. 1>>Тут проблема в том что С проще и его проще учить. Ну или по крайней мере так полагает большинство авторов. P>в статье как раз говорится что C++ легче учить (хотя бы до определённого уровня)
Может легче. Понятия не имею. Испытать не на ком.
1>>Насчет статьи: 1>>Я не перепечатывал код полностью — но пример данный мной в прошлом сообщении взят именно из этой статьи. И он хорошо показывает, что статья не в полне объективна. Она показывает выигрыш С++ в скорости над С. Но написав сишный код чуть-чуть подругому мы получаем диаметрально противоположный результат.
P>сравниваются две "обобщённые"(как вы сами сказали). да, алгоритмы сортировки в реализации могут быть разные, но давайте возьмём один алгоритм, ок? P>Вы написали не обобщённую C версию, при этом когда я из неё сделал на C++ обобщённую — qSortIT, её скорость была не меньше скорости не обобщённой C версии — вы это увидели?
Да. Я нигде не оспариваю, что на С++ можно получить быстродействие практически идентичное С. Плюс минус пренебрежительную дельту. Я оспариваю утверждение у вас и в статье, что С++ быстрей С.
1>>Мне очень не нравиться попытка сравнить std::sort и qsort. Как я уже сказал, qsort — это нечто вроде wchar_t под unix. Да она есть — но ей в большинстве случаев не пользуются. И она априорно медленней std::sort — что там можно сравнивать, тестировать и как на основе этого теста можно говорить, что С++ быстрей. И утверждение, что более высокий уровень абстракции и защиты от ошибок при этом дает увеличение скорости не лезет ни в какие ворота.
P>почему, по-моему как раз таки лезет. P>1) есть две обощённые(в вашем понимании функции) qsort и std::sort
Причем заведомо известно, что qsort медленней std::sort P>2) интерфейс std::sort более безопасен и менее подвержен ошибкам чем qsort
Верно. P>3) при равный используемых алгоритмах сортировки std::sort будет быстрее qsort
Ну да. Вот я и не понимаю — что можно сравнивать. Автор этой статьи не знает как работают шаблоны? Или что? Если человек ну хоть капельку знает С и С++, то он знает правильный ответ и без этих исследований.
P>с чем из этого вы не согласны?
Ну если бы высокий уровень абстракции и защиты от ошибок увеличивал скорость самыми быстрыми языками были бы Lsip-подобные. Здравый смысл.
AS>>С примером, в котором очевидно где 'видно что безопасней и легче', когда тыкать будешь?! P>я уже привёл пример с тремя ресурсами.
Тебе объяснить почему он некорректный и нерабочий? Или сам догадаешься? Давай ты напишешь ПОЛНЫЙ и РАБОЧИЙ пример, и уже с ним будем чего то обсуждать и сравнивать, а так получается сравнение сферического коня в вакууме с рабочим кодом.
Или для настоящего мачо приводить компиируемые и работающие примеры архисложная задача? )))
Здравствуйте, RSATom, Вы писали:
P>>ещё возможные варианты (я их не тестировал, полностью не уверен): P>>4) Intel C вроде понимает C99, и не плохо интегрируется со студией RSA>сколько стоит интересно...
на сайте intel должна быть цена. предполагаю что не больше 500$, а то и меньше
P>>5) CLang/LLVM RSA>недавно портировал некоторое количество кода из студии в XCode 4.3, получил забавную ошибку (может и я конечно чего то не понимаю): RSA>
RSA>template<typename t1>
RSA>class A
RSA>{
RSA>protected:
RSA> int m_i;
RSA>};
RSA>template<typename t1, typename t2>
RSA>class B: public A<t1>
RSA>{
RSA>public:
RSA> void foo() { ++m_i; }//веселье тут - говорит, типа не знаю никаких m_i... пришлось this->m_i; ну или ++A<t1>::m_i;
RSA>};
RSA>
RSA>не уверен что повторил на 100% точно, но что то в этом духе.
всё правильно, это шаблоны.. у студии в этом месте по умолчанию включено толерантное расширение языка (по-моему можно отключить).
по моему опыту clang более строгий в плане стандарта чем gcc
P>>6) автотрансляция кода с С99 в более старую версию RSA>меня гложут смутные сомнения что в этой области неба безоблачно...
а вообще возвращаясь к исходному:
P>>>>А зачем вообще может понадобится использовать C, когда есть C++ ? RSA>>>Существуют Open Source проекты написаные на с99, иногда хочется их портировать под винду для использования в каких либо проектах. Яркий пример ffmpeg.
то к выделенному эта проблема никак не относится, так как даже если бы вы использовали MSVS C (не C++), то проблема бы никуда не делась.
Здравствуйте, Alexéy Sudachén, Вы писали:
AS>>>Ну, по причине неадекватной сложности, ведущей к постоянной борьбе с языком, и постоянного вынужденного скатывания к синтаксическому онанизму. Плюс к тому ещё и высокая сложности разбора крешей в случае использования 'правильных' либ. AS>>>Привело к серьёзному упрощению кода, который теперь можно понять не изучая в течении нескольких лет методы высокой магии и прорицания в пространствах синтаксических подсластителей.
P>>Синтаксический онанизм говоришь? методы высокой магии? прорицание в пространствах синтаксических подсластителей? серьёзное упрощение кода? P>>ну-ну :
AS>Ох, порвал как тузик грелку!
ну да
AS>Мне из какого файла STL привести кусок кода в качестве примера? ИМХО из любого.
о каких файлах STL ты вообще говоришь? есть стандарт, есть интерфейс, и да, есть реализации некоторые из которых могут быть кривыми.
AS>Я уж не говорю про силиконовый (или какой другой) протез, без которого писать на плюсах по человечески невозможно.
AS>Я согласен что для идиотов, что не знают самого языка, но с упоением спорят о метафизики и шаблонах, пара свичей ещё тот бетхерт, но вот проблема — содержимое продукта лихорадочного бреда Степанова сих индивидуумов ваще вгонит в глубокий когнитивный диссонанс, а силиконовые сиськи порвут как капля никотина хомяка. Но кто же лазит разбираться как устроены сиськи?
опять какой-то понос и батхёрт
а так, Степанов — крутой мужик
AS>В остальном, можно по существу что напрягает адепта двух плюсов в этом коде? Макросы? Это как бы прямой путь реализации многих вещей в С, и не надо тащить своё табу ни них из плюсов. Минимальное знание самого языка, а не приёмов построения рекурсивного шаблонного бреда... ну, ё-моё, избавляйтесь от вредных привычек и учите синтаксис.
Ещё раз, ты говорил о синтаксическом онанизме. Я тебе привёл код (который по всей видимости ты и используешь), который и есть сплошной синтаксический онанизм.
Теперь же ты сменил пластинку, и говоришь "учите синтаксис"
AS>Хотя мы вроде как не о реализации рантайма спорили, а о том можно ли написать на С код с автоматическим управлением ресурсами толерантный к исключениям, я привёл РАБОЧИЙ (в отличии от тебя) пример что можно, и очень просто.
а я с тобой и не спорил:
AS>>И да, на С, но с исключениями, автоматическим управлением ресурсами и объектной моделью. С++ для всего этого не особенно и не нужен. P>Я не совсем понял, вы используете подмножество C++ ? P>Или просто C? Как объектную модель можно на C сэумлировать — мне понятно. Но вот исключения и автоматическое управление ресурсами на С — сходу не соображу как сделать.
я спросил как это можно сделать..
как пример ты привёл трёхэтажный синтаксический препроцессорный онанизм, против которого ты сам высказывался ранее
AS>На больших объёмах кода проще чем в плюсах, между прочим.
ну понятно, на C++ у тебя не срослось, на С что-то получилось, теперь ты рассказываешь что проще
AS>Но уж коли мы пошли в реализацию ... ты можешь менять реализацию под конкретную платформу в С++, ой а шо так? Или хотя бы иметь гарантии по способу реализации механизмов, или хотя бы гарантии что они вообще реализованы? Вопрос типа риторический. )
Реализацию чего? Вызова деструкторов?
А ты можешь менять реализацию if/while/for/goto на C? "ой, а шо так?".
парень, ты уже что-то совсем желчью исходишь.. [зевок] уже совсем не интересно..
C:\Projects\13>g++ 1.cpp -o 1
C:\Projects\13>1
que paso?
Как бы для того шоб горить про простоту и лёгкость, неплохо бы для начала пройти хотя бы по некоторым хитро замаскированным граблям. А уж про auto_ptr, что я убрал, вообще отдельный трактат написать можно.
Здравствуйте, Piko, Вы писали:
P>о каких файлах STL ты вообще говоришь? есть стандарт, есть интерфейс, и да, есть реализации некоторые из которых могут быть кривыми.
Дык можно взять любую.
AS>>В остальном, можно по существу что напрягает адепта двух плюсов в этом коде? Макросы? Это как бы прямой путь реализации многих вещей в С, и не надо тащить своё табу ни них из плюсов. Минимальное знание самого языка, а не приёмов построения рекурсивного шаблонного бреда... ну, ё-моё, избавляйтесь от вредных привычек и учите синтаксис. P>Ещё раз, ты говорил о синтаксическом онанизме. Я тебе привёл код (который по всей видимости ты и используешь), который и есть сплошной синтаксический онанизм. P>Теперь же ты сменил пластинку, и говоришь "учите синтаксис"
Дык что именно в мём коде синтаксический онанизм? Несколько тривиальных макросов выполняющих постдействие? Да, они с многими конструкциями из STL рядом не стояли по сложности. Или авторелиз пула? Ну тут вообще не понятно в чём проблема. В том что ты не понял как это работает? Ну мои сожаления. )
P>я спросил как это можно сделать.. P>как пример ты привёл трёхэтажный синтаксический препроцессорный онанизм, против которого ты сам высказывался ранее
Я привёл рантайм и один макрос который избавляет от необходимост закрытия TRY блока. Несколько тривиальных инстркуций на всю прорамму свёрнутые в ключевое слово с одназначно прозрачной семантикой ... ну видимо ты плохо знаком с проблемами С++. Возможно всего лишь в рамках букваря.
AS>>На больших объёмах кода проще чем в плюсах, между прочим. P>ну понятно, на C++ у тебя не срослось, на С что-то получилось, теперь ты рассказываешь что проще
Гы, ещё раз послать почитать избранное?
P>Реализацию чего? Вызова деструкторов?
Например реализацию исключений. Да ладно менять, хотя бы гарантировать что она есть. Про шаблонные же выверты можно просто скромно промолчать.
P>А ты можешь менять реализацию if/while/for/goto на C? "ой, а шо так?".
Шутку понял, смешно. Теперь осталось тебе понять о чём говорил я, но для этого правда надо написать несколько лямов строк кода на С++ и наступить хотя бы на основные грабли.
P>парень, ты уже что-то совсем желчью исходишь.. [зевок] уже совсем не интересно..
Гы, ну дык, ты даже не смог пример привести без очевидных ляпов, конечно не интересно. Как малышу в универе.
только сначала скажи зачем, и приведи аналог на C. Я ведь изначально просил псевдокод.
AS>Как бы для того шоб горить про простоту и лёгкость, неплохо бы для начала пройти хотя бы по некоторым хитро замаскированным граблям.
говори конкретно про грабли, не томи...
диалог с тобой совсем не конструктивный получается, и утомляет [зевок], у меня почти нет желания продолжать тратить своё время(которое есть деньги).. так что давай поконкретнее.
AS>А уж про auto_ptr, что я убрал, вообще отдельный трактат написать можно.
в примере где я его использовал — он безобиден
да, auto_ptr не идеален, есть пара моментов о которых нужно знать, но как бы всё вытекает из интерфейса, хитрости реализации знать не надо..
вообще smart-поинтеры в C++ нужны далеко не всегда..
_>Только законченному идиоту придет в голову писать ОС, или упаси бог, ядро этой ОС на С++, используя концепцию ООП, особенно в CLI нотации.
Так ведь пришло в голову написали пишут. BeOS была на C++ написана, сейчас Haiku тоже пилят на C++, причём именно ядро. И что-то на идиотов там никто не похож.
AS>>Мне из какого файла STL привести кусок кода в качестве примера? ИМХО из любого. Я уж не говорю про силиконовый (или какой другой) протез, без которого писать на плюсах по человечески невозможно.
NB>А что конкретно в реализации СТЛ вызывает затруднения?
Найти людей которые могут не только читать код, активно его пользующий, но и как то его менять. Причём желательно за адекватные деньги.
Основная проблема С++ в том, что сопровождение кода стоит дороже его написания, и требует квалификации существенно выше чем у того, кто его писал. Такая вот парадоксальная зависимость. При условии же что чем программер лучше, тем меньше он хочет сопровождать чужой код... очевидно неинтересная.
От собственно это в реализации STL у меня и вызывает затруднения.
Кстати, то что я делаю на С с ресурсами и исключениями, вообще достаточно распространённая практика, существующая хрен знает сколько времени, но явно больше чем мой стаж программера. Я лишь обернул это в удобные макросы и определил несколько правил кодирования, однако сколько это воплей вызвало... ))) Причём никакой скрытой логики я в общем-то не добавил.
Это всё к тому, что те кто упорно твердят — на С закат солнца делается сугубо только руками, несколько заблуждаются. Как и те кто убеждены что C++ всё сделает за них и бесплатно.
Сколько бы клинап автопула не стоил, он позволяет работать с обычными указателями не заботясь о их правильном удалении. Иначе говоря писать совершенно прозрачный код без всяких шаблонных выкрутасов в каждой строчке кода и кучи скрытой логики. В С нет скрытой логики, она вся на поверхности, это и есть его основное преимущество. В С++ же такое сделать в принципе невозможно, в силу концепции языка, а если бы и можно было это пошло бы в разрез с Единственным Истинно Верным Способом Программировать. )))
Однако если тебе нужно точно знать кто кому сливает, дык возьми да проверь ))) Делов то.
Здравствуйте, 11molniev, Вы писали:
P>>>>>>>>а чем принципиально indirect call отличается от virtual call в контексте runtime decision? и то и то получается посредством усилий разработчика 1>>>>>>>В С эти усилия всегда в явном виде. С++ можно и без усилий получить их по дефолту. Проще говоря на чистом Си тормоза всегда являются результатом осознанного решения разработчика. Только то и всего. P>>>>>>а где в C++ их можно получить по дефолту, да так чтобы не знать об этом? P>>>>>>я когда пишу virtual — всегда осознаю, что в 99% случаев это будет indirect call через vtable 1>>>>>Сама концепция объекта как черного ящика их предполагает. P>>>>поясните что именно вы имеете ввиду, в данном контексте 1>>>То что сама концепция ООП с классами как черными ящиками подразумевает неизвестность будут тормоза или нет. Это "детали скрытые конкретной реализацией". Одновременно и ирония и правда. P>>тоже самое можно сказать о функции — вот смотришь на декларацию — и не поймёшь — будут тормоза или нет. 1>Дык функция то и есть конкретная реализация)) Ничего не скрывается за абстракцией)) Я говорю о том, что в случае с ООП сама парадигма противоречит "я когда пишу virtual — всегда осознаю, что в 99% случаев это будет indirect call через vtable". Ничего более.
тоже самое можно сказать и о простом вызове функции по указателю: когда я делаю вызов функции по указателю в 99% случаев это будет indirect call
P>>Простое переписывание вручную на ассемблер ничего не даст, а зачастую наоборот замедлит. 1>Ну дык смотря кто переписывает. P>>Многие верят в миф, что просто ручное написание на ассемблере даст ускорение — это bullshit. Простого переписывания не достаточно для обгона компилятора. 1>Да просто недостаточно. Надо ещё думать головой, иметь соответствующий опыт, хоть минимальные знания и пользоваться профайлером — и тогда код будет быстрей.
при грамотной оптимизации, ассемблерный код, intrinsic и т.п., как я уже сказал будут обвёрнуты в небольшие абстракции.
Это далеко не тоже самое, что многие подразумевают под "переписывание вручную на ассемблер"
P>>>>Понимаете, для сортировки есть разные алгоритмы, разные реализации std::sort 1>>>Ну я то тут причем? Это вы ведь приводите исследование их сравнивающее. Причем уже во второй раз. На Си там быстрая сортировка. P>>я согласен, просто сравнение скорости std::sort и qsort из какой-нибудь реализации не полностью честно. P>>Но, идея в том, что если взять одинаковые алгоритмы, один из которых обвернуть в qsort, другой в std::sort, std::sort будет быстрее. 1>Но это си. Здесь нельзя ничего обернуть не получив проигрыша в скорости. Но если взять одинаковые алгоритмы, хорошо написанные, то скорость либо будет одинаковой либо у С больше.
если алгоритмы одинаковые, хорошо написанные, почему вы не сказали про вариант, когда скорость у C++ больше?
Если это по вашему мнению не возможно, то с чего вообще есть вариант когда код C быстрее?
1>>>>>>>>>Если хотите скину код, состряпанный на скорую руку. P>>>>>>>>если не трудно — то скиньте, мне будет интересно. можно сюда, а можно в http://ideone.com/ 1>>>>>>>http://pastebin.com/YsGRBtZ0 — только #include "stdafx.h" уберите, я забыл 1>>>>>>>http://ideone.com/iL6Gb 1>>>>>>>На скорую рука, так что не очень, но общий подход иллюстрирует. P>>>>>>http://pastebin.com/QXPU0zWC P>>>>>>test_c2 и test_cplusplus3 по скорости примерно одинаковы. 1>>>>>На N=100000000, qsort: 28.758331, std::sort: 20.791297, c: 17.333931 соотношение 1,38 и 1,199 1>>>>>На N=10000000 qsort: 2.567289, std::sort: 1.824936, c: 1.510803 соотношение 1,40 и 1,20 1>>>>>т.е. то о чем я говорю: переписывания куска кода на чистый с раздуло этот код и ускорило его работу на ~20 процентов. В два раза меньше чем использование std::sort вместо qsort — так что цифры увеличения скорости вполне сопоставимы. 1>>>>>Единственный момент: это 64 разрядный код, std::sort при N=100000000 на 32 битах вылетело с исключением)). Для 32 qsort vs std::sort получается в районе 1,6. P>>>>Вы видели test_cplusplus3 ????? У вас там есть разница в скорости? 1>>>Опечатался. Разумеется просто "test_cplusplus". Разница в скорости есть, код у вас есть — можите сравнить. P>>Вы видели test_cplusplus3 (цифра три на конце) ? выделенная жирным ссылка на pastebin 1>Перепутал ваши и свои слова. Теперь видел. Разницы нет. Равно как и разницы между вариантом на С и на С++, за исключением возможности применения последнего к любым объектам реализующим соответствующий интерфейс. Это фактически то о чем я и говорю — на С++ можно написать код идентичный С (когда то С с классами)) ). И получить идентичную скорость. Быстрей сделать нельзя. Вот и все. При этом С++ кода будет меньше.
Я говорил:
P>ещё раз, вы говорите, что скорость C++ достигается за счёт legacy C.
P>std::sort это legacy С?
P>или вы имеете ввиду то, что для любого C++ кода можно написать аналогичный C код? если да, то я и не спорю — да можно, есть даже авто трансляторы с C++ на C. вот только размер аналогичного С кода будет не меньше, а в большинстве случаев больше в разы.
1. Вы понимаете, что этот аналогичный код на C, зачастую не пишется и оставляется не оптимальная версия, как раз из-за размера кода?
2. Для создания оптимального кода на C++, делать реализацию на legacy C нет необходимости(как считают многие), так как есть возможность реализовать это в разы, а то и на порядки меньшим кодом.
вы согласны с этими пунктами?
P>>Вы не поняли меня. В ваших тестах (да и в тех что я добавил, основываясь на вашем подходе), производится сравнение скорости сортировки на разных случайных наборах. А нужно делать сравнение на одинаковых, но при это всё равно случайных наборах. 1>1. Это компенсируется несколькими прогонами вот и все. Получаем медиану. Нам же ведь нужна примерное соотношение скорости, а не десятые доли процента скорости.
вы уверены, что это десятые доли процента, а не проценты или десятки процентов?
1>2. У нас довольно большой массив элементов, а диапазон их изменения не настолько велик. Фактически статистика сглаживается для таких массивов. 1>Поэтому я позволил себе каждый раз генерировать последовательность заново.
использовать одну и ту же последовательность совсем не трудно.. даже необходимо в контексте этого теста
1>>>>>>>И? Померились? P>>>>>>?? я с вами мерится не собирался, мне интересно сравнение C vc C++, без личностей... 1>>>>>Извините, если восприняли, как переход на личности (хотя подтекст не скрою)) ). Просто очевидно, что С предоставляет меньшие возможности по инициализации/освобождению ресурсов и в подобных сравнениях кода на С будет больше, чем на плюсах. P>>>>я думаю при создании функции с 10 ресурсами, как минимум большинство программистов сделает ошибку, а то и не одну. P>>>>Зачем вообще надрываться и использовать C, когда есть C++? (естественно, кроме тех случаев когда использование C++ невозможно из-за отсутствия компилятора) 1>>>Как минимум у разных людей разные предпочтения. Ну действительно — зачем надрываться и сажать картошку, если можно есть саранчу, которая сама вырастит. P>>тут я не спорю — вкусы у всех разные. P>>Но, зачастую "отрекание" от C++ в сторону C, происходит на основе неправильной интерпретации опыта. 1>Могу лишь развести руками. В сущности главное качественный конечный результат. И если человек не умеет правильно интерпретировать опыт — то пусть лучше пишет на С . Это будет выглядеть не так ужасно, как на С++.
интересные у нас с вами получаются заключения:
И если человек не умеет правильно интерпретировать опыт — то пусть лучше пишет на С
хорошо, я согласен, давайте запихаем всех неадекватов в загон "Язык C". некоторые из этого топика уже сами себя загнали
1>>>>>Ну и насчет безопастности — все таки это больше зависит от опыта. Я вот в коде допустил такую дуратскую ошибку, а в реальном коде как в Enter/Leave оборачиваются очень небольшие участки, внутри которых нет переходов за них. И участки эти в голове прокручиваю. А тут просто набросал как пример и даже не задумался, будет работать или нет. Хотя я склонен думать, что программист с малым опытом на С++ допустит меньше ошибок чем на С. Но только если будет следовать RAII, а не писать legacy. Но понимание всей прелести RAII приходит только с опытом. P>>>>Тут проблема в образовании, многие начинают учить C++ начиная с legacy C, приобретают вредные привычки, и часто далеко не выходят за пределы legacy C. Прочитайте статью http://www2.research.att.com/~bs/new_learning.pdf — мне понравилось. 1>>>Тут проблема в том что С проще и его проще учить. Ну или по крайней мере так полагает большинство авторов. P>>в статье как раз говорится что C++ легче учить (хотя бы до определённого уровня) 1>Может легче. Понятия не имею. Испытать не на ком.
будет время, прочитайте статью, с начала (а не просто сравнение сортировок)
1>>>Насчет статьи: 1>>>Я не перепечатывал код полностью — но пример данный мной в прошлом сообщении взят именно из этой статьи. И он хорошо показывает, что статья не в полне объективна. Она показывает выигрыш С++ в скорости над С. Но написав сишный код чуть-чуть подругому мы получаем диаметрально противоположный результат.
1>>>Мне очень не нравиться попытка сравнить std::sort и qsort. Как я уже сказал, qsort — это нечто вроде wchar_t под unix. Да она есть — но ей в большинстве случаев не пользуются. И она априорно медленней std::sort — что там можно сравнивать, тестировать и как на основе этого теста можно говорить, что С++ быстрей. И утверждение, что более высокий уровень абстракции и защиты от ошибок при этом дает увеличение скорости не лезет ни в какие ворота. P>>почему, по-моему как раз таки лезет. P>>1) есть две обощённые(в вашем понимании функции) qsort и std::sort 1>Причем заведомо известно, что qsort медленней std::sort P>>2) интерфейс std::sort более безопасен и менее подвержен ошибкам чем qsort 1>Верно. P>>3) при равный используемых алгоритмах сортировки std::sort будет быстрее qsort 1>Ну да. Вот я и не понимаю — что можно сравнивать. Автор этой статьи не знает как работают шаблоны? Или что? Если человек ну хоть капельку знает С и С++, то он знает правильный ответ и без этих исследований.
подождите, ну буквально чуть выше вы написали:
И утверждение, что более высокий уровень абстракции и защиты от ошибок при этом дает увеличение скорости не лезет ни в какие ворота.
давайте ещё более конкретней, прям по этому высказыванию:
std::sort vs qsort:
1) std::sort — более высокий уровень абстракции ?
2) более высокий уровень защиты от ошибок ?
3) дает увеличение скорости ?
P>>с чем из этого вы не согласны? 1>Ну если бы высокий уровень абстракции и защиты от ошибок увеличивал скорость самыми быстрыми языками были бы Lsip-подобные. Здравый смысл.
вы понимаете, что абстракции могут иметь разные реализации. и да, некоторые могут быть медленней.
но, у нас как бы разговор, и есть определённый контекст.
Конкретно я имею ввиду, что C++ позволяет писать более абстрактный, более безопасный, и более быстрый код — и всё это одновременно.
NB>ты несколько сгущаешь краски. NB>думаю, то же самое можно сказать и про твой код. NB>тут проблема не в шаблонах или макросах, а в программистах.
Проблема всегда в программистах, языки без оных не существуют.
AS>>Это всё к тому, что те кто упорно твердят — на С закат солнца делается сугубо только руками, несколько заблуждаются. Как и те кто убеждены что C++ всё сделает за них и бесплатно. NB>если не хочешь за удобство платить в рантайме, то именно что руками как бы не хотелось обратного.
Плата бывает очень разная. Скорость и удобство это самые дешёвые её варианты.
NB>и дело не только в исключениях. NB>у тебя, допустим, наследование используется? делать касты к базе приходится?
Да, Нет, а вот так )
AS>>Однако если тебе нужно точно знать кто кому сливает, дык возьми да проверь ))) Делов то. NB>ну, то есть тебя этот вопрос не сильно интересует? пинятно.
Естественно. Неужели для тебя новость что как минимум 80% программы никак не влияет на её скорость исполнения?! Да, не, не верю.
Здравствуйте, Alexéy Sudachén, Вы писали:
NB>>и дело не только в исключениях. NB>>у тебя, допустим, наследование используется? делать касты к базе приходится?
AS>Да, Нет, а вот так )
остается только за тебя порадоваться
AS>>>Однако если тебе нужно точно знать кто кому сливает, дык возьми да проверь ))) Делов то. NB>>ну, то есть тебя этот вопрос не сильно интересует? пинятно.
AS>Естественно. Неужели для тебя новость что как минимум 80% программы никак не влияет на её скорость исполнения?! Да, не, не верю.
хз. почему бы тогда не писать на питоне, допустим.
я вот когда писал "еще одну либу для матриц" не поленился сравнить производительность с ручным кодом.
тогда и понял что разговоры о умении компилеров оптимизировать шаблонный код немного преувеличены (хотя, надо отдать должное, с лямбдами они справились)
NB>>>ну, то есть тебя этот вопрос не сильно интересует? пинятно. AS>>Естественно. Неужели для тебя новость что как минимум 80% программы никак не влияет на её скорость исполнения?! Да, не, не верю. NB>хз. почему бы тогда не писать на питоне, допустим.
Ну дык у меня используются ровно два языка. С и питон. К сожалению, второй ни везде можно с собой утянуть, да и другие проблемы с ним имеются.
NB>я вот когда писал "еще одну либу для матриц" не поленился сравнить производительность с ручным кодом. NB>тогда и понял что разговоры о умении компилеров оптимизировать шаблонный код немного преувеличены (хотя, надо отдать должное, с лямбдами они справились)
Те несколько процентов, что реально требуют производительности, можно очень тщательно вылизать. Однако проблема в том, что не всегда можно заранее сказать какой именно кусок кода будет тормозить. Иногда бывают очень удивительные открытия, уж больно хитрое современное железо стало.
Здравствуйте, Alexéy Sudachén, Вы писали:
AS>>>В остальном, можно по существу что напрягает адепта двух плюсов в этом коде? Макросы? Это как бы прямой путь реализации многих вещей в С, и не надо тащить своё табу ни них из плюсов. Минимальное знание самого языка, а не приёмов построения рекурсивного шаблонного бреда... ну, ё-моё, избавляйтесь от вредных привычек и учите синтаксис. P>>Ещё раз, ты говорил о синтаксическом онанизме. Я тебе привёл код (который по всей видимости ты и используешь), который и есть сплошной синтаксический онанизм. P>>Теперь же ты сменил пластинку, и говоришь "учите синтаксис" AS>Дык что именно в мём коде синтаксический онанизм? Несколько тривиальных макросов выполняющих постдействие? Да, они с многими конструкциями из STL рядом не стояли по сложности. Или авторелиз пула? Ну тут вообще не понятно в чём проблема. В том что ты не понял как это работает? Ну мои сожаления. )
(имхо, вопрос задан чётко и лаконично, и контекста предостаточно)
"Является ли приведённый ниже фрагмент кода синтаксическим онанизмом?: Да 21; Нет 3".
AS>Ну, по причине неадекватной сложности, ведущей к постоянной борьбе с языком, и постоянного вынужденного скатывания к синтаксическому онанизму.
То есть ты как на C++ скатывался к синтаксическому онанизму, так и на C.
Кэп mode on: Может дело не в языках, а в тебе?
P>>я спросил как это можно сделать.. P>>как пример ты привёл трёхэтажный синтаксический препроцессорный онанизм, против которого ты сам высказывался ранее
AS>Я привёл рантайм
а где именно ты привёл runtime?
AS>и один макрос который избавляет от необходимост закрытия TRY блока. Несколько тривиальных инстркуций на всю прорамму свёрнутые в ключевое слово с одназначно прозрачной семантикой ... ну видимо ты плохо знаком с проблемами С++. Возможно всего лишь в рамках букваря.
то есть когда результаты твоего синтаксического онанизма на C обвёрнуты во что-нибудь, то они уже допустимы?
Может тебе стоило попробовать делать тоже самое на C++ ?
P>>Реализацию чего? Вызова деструкторов? AS>Например реализацию исключений. Да ладно менять, хотя бы гарантировать что она есть. Про шаблонные же выверты можно просто скромно промолчать.
какого рода гарантии тебе нужны?
P>>А ты можешь менять реализацию if/while/for/goto на C? "ой, а шо так?". AS>Шутку понял, смешно. Теперь осталось тебе понять о чём говорил я, но для этого правда надо написать несколько лямов строк кода на С++ и наступить хотя бы на основные грабли.
То есть ты намекаешь, что сам, лично написал пару лямов строк кода?
За сколько лет?
И сколько конкретно "лямов"?
P>>парень, ты уже что-то совсем желчью исходишь.. [зевок] уже совсем не интересно.. AS>Гы, ну дык, ты даже не смог пример привести без очевидных ляпов, конечно не интересно. Как малышу в универе.
(имхо, вопрос задан чётко и лаконично, и контекста предостаточно) P>"Является ли приведённый ниже фрагмент кода синтаксическим онанизмом?: Да 21; Нет 3".
Пошутил да. )))) Вообще-то ровно в том же объёме что и RAII, иначе говоря нет, не является. А то что миллионы мух... ну ты сам знаешь, дык вот мне это сугубо фиолетово. Кстати, показательно что 3 человека язык таки знают.
AS>>Ну, по причине неадекватной сложности, ведущей к постоянной борьбе с языком, и постоянного вынужденного скатывания к синтаксическому онанизму. P>То есть ты как на C++ скатывался к синтаксическому онанизму, так и на C. P>Кэп mode on: Может дело не в языках, а в тебе?
Может быть, а может и в том, что ты не знаком с разными методами писания кода на C недостойном внимания настоящих мачо, ограничившись вузовским введением перед прыжком в гламурно-сахарный С++?
P>>>я спросил как это можно сделать.. P>>>как пример ты привёл трёхэтажный синтаксический препроцессорный онанизм, против которого ты сам высказывался ранее
В макросах, количество которых можно пересчитать по пальцам? Кстати, ты уж разъясни в чём именно там онанизм? В использовании препроцессора? Может некоторое неоднозначное поведение, сложная логика, комплексное использование нетривиальных приёмов программирования без особой надобности? Или может быть это можно сделать как-то существенно проще, прямо в коде без расписывания на каждый чих что потом делать с созданным объектом. Дык это, продемонстрируй свой интеллект и глубокое знания языка. Только пожалуйста без упоминание в КАЖДОЙ строчки кода неких этажных конструкций с отсылкой на скрытое поведение. И да, не попади при этом под анальные кары адептов двух плюсов, они же таки шалуны, начинают кипятиться только от одного упоминания new в коде, а сырые касты их вообще взрывают. Так что осторожнее там. Сисиек побольше или всякого там std:: хлама, ну и вообще шоб компилер заценил... минуты так на две минимум )))
P>а где именно ты привёл runtime?
Это ты привёл кусок моего рантайма. Весь yoyo и фактически и есть рантайм.
Плюс несколько макросов расширяющих язык специальными конструкциями, которые локальны и на написание остального кода практически не влияют. Есть ровно одно правило — всё что осталось на пуле будет освобождено при выходе из маркированного блока, и никаких магических заклинаний. Макрос лишь просто вставка очистки пула в конец блока. В этом и есть существенный плюс в сравнении с двумя плюсами.
P>то есть когда результаты твоего синтаксического онанизма на C обвёрнуты во что-нибудь, то они уже допустимы? P>Может тебе стоило попробовать делать тоже самое на C++ ?
А ты вот попробуй. ))) Покажи своё владение силой, Люк. Напиши ровно то же что и я, только на С++, хоть с STL, хоть с сиськами, с чем угодно. Давай сравним простоту, понятность кода и конечно же количество использованных сущностей и их внутреннюю сложность. Только рабочий пример, а не сферического коня в вакууме.
AS>>Например реализацию исключений. Да ладно менять, хотя бы гарантировать что она есть. Про шаблонные же выверты можно просто скромно промолчать. P>какого рода гарантии тебе нужны?
Хотя бы просто то что я МОГУ их использовать. Я знаешь ли уже не раз сталкивался с случаями когда каменный цветок упорно отказывался выходить.
P>То есть ты намекаешь, что сам, лично написал пару лямов строк кода? P>За сколько лет?
Больше ))) Много больше ляма только в своих собственных проектах, для души так сказать. В рамках эксперимента, посмотреть что будет если делать так, и вот так, и ещё вот так, если это вообще работать будет. Но куда тебе такое понять, если для тебя даже работающий пример написать проблема непреодолимой сложности.
Коли пошёл такой разговор, вот вы товарищ аноним, вы ваще кто будете?
AS>>Гы, ну дык, ты даже не смог пример привести без очевидных ляпов, конечно не интересно. Как малышу в универе. P>Какие ляпы, ты о чём?
От твоём сферическом коне в вакууме. Сходи что ли к старшим товарищам, попроси их объяснить что именно я тебе показал в расширенном варианте. ))) Я же уже говорил — благотворительность не занимаюсь.
(имхо, вопрос задан чётко и лаконично, и контекста предостаточно) P>>"Является ли приведённый ниже фрагмент кода синтаксическим онанизмом?: Да 21; Нет 3". AS>Пошутил да. )))) Вообще-то ровно в том же объёме что и RAII, иначе говоря нет, не является. А то что миллионы мух... ну ты сам знаешь, дык вот мне это сугубо фиолетово.
синтаксический онанизм/не онанизм — это сугубо субъективные оценки, поэтому я и сделал опрос.
AS>Кстати, показательно что 3 человека язык таки знают.
Знают? или просто не считают это синтаксическим онанизмом?
AS>>>Ну, по причине неадекватной сложности, ведущей к постоянной борьбе с языком, и постоянного вынужденного скатывания к синтаксическому онанизму. P>>То есть ты как на C++ скатывался к синтаксическому онанизму, так и на C. P>>Кэп mode on: Может дело не в языках, а в тебе? AS>Может быть, а может и в том, что ты не знаком с разными методами писания кода на C недостойном внимания настоящих мачо, ограничившись вузовским введением перед прыжком в гламурно-сахарный С++?
А как вообще я причастен к тому, что ты и на C++ и на С "вынужден скатываться к синтаксическому онанизму", но при этом считаешь это неприемлемым для C++, но приемлемым для C?
P>>>>я спросил как это можно сделать.. P>>>>как пример ты привёл трёхэтажный синтаксический препроцессорный онанизм, против которого ты сам высказывался ранее AS>В макросах, количество которых можно пересчитать по пальцам? Кстати, ты уж разъясни в чём именно там онанизм? В использовании препроцессора? Может некоторое неоднозначное поведение, сложная логика, комплексное использование нетривиальных приёмов программирования без особой надобности?
многоэтажные управляющие структуры для реализации простого пост эффекта.
я не спорю — на C это может быть полезно, так как нет встроенного авто-освобождения ресурсов, но — эта реализация всё равно синтаксический онанизм.
AS>Плюс несколько макросов расширяющих язык специальными конструкциями, которые локальны и на написание остального кода практически не влияют. Есть ровно одно правило — всё что осталось на пуле будет освобождено при выходе из маркированного блока, и никаких магических заклинаний. Макрос лишь просто вставка очистки пула в конец блока. В этом и есть существенный плюс в сравнении с двумя плюсами.
В чём, чём плюс?
Может в runtime overhead на освобождение ресурсов?
P>>то есть когда результаты твоего синтаксического онанизма на C обвёрнуты во что-нибудь, то они уже допустимы? P>>Может тебе стоило попробовать делать тоже самое на C++ ?
AS>А ты вот попробуй. ))) Покажи своё владение силой, Люк. Напиши ровно то же что и я, только на С++, хоть с STL, хоть с сиськами, с чем угодно. Давай сравним простоту, понятность кода и конечно же количество использованных сущностей и их внутреннюю сложность. Только рабочий пример, а не сферического коня в вакууме.
только давай ты сначала выдерешь из своего "рантайма" всё что необходимо для этого примера, и оформишь в виде одного файла, ок?
AS>>>Например реализацию исключений. Да ладно менять, хотя бы гарантировать что она есть. Про шаблонные же выверты можно просто скромно промолчать. P>>какого рода гарантии тебе нужны? AS>Хотя бы просто то что я МОГУ их использовать. Я знаешь ли уже не раз сталкивался с случаями когда каменный цветок упорно отказывался выходить.
В каком году у тебя не выходил каменный цветок последний раз?
P>>То есть ты намекаешь, что сам, лично написал пару лямов строк кода? P>>За сколько лет? AS>Больше ))) Много больше ляма только в своих собственных проектах, для души так сказать. В рамках эксперимента, посмотреть что будет если делать так, и вот так, и ещё вот так, если это вообще работать будет. Но куда тебе такое понять, если для тебя даже работающий пример написать проблема непреодолимой сложности.
сколько лет, и сколько лямов строк собственноручно(+-500k)? это такой сложный вопрос для гулявших по граблям по пути через лямы строк гуру?
если это 4M и 10 лет, то в средним на каждый день получается больше 1k строк, что как-то совсем дохреновато. если конечно это не мелкие зубочистки, либо тонны говнокода.
Здравствуйте, Piko, Вы писали:
AS>>Плюс несколько макросов расширяющих язык специальными конструкциями, которые локальны и на написание остального кода практически не влияют. Есть ровно одно правило — всё что осталось на пуле будет освобождено при выходе из маркированного блока, и никаких магических заклинаний. Макрос лишь просто вставка очистки пула в конец блока. В этом и есть существенный плюс в сравнении с двумя плюсами. P>В чём, чём плюс? P>Может в runtime overhead на освобождение ресурсов?
В C++ надо понимать освобождение ресурсов бесплатное. )
AS>>А ты вот попробуй. ))) Покажи своё владение силой, Люк. Напиши ровно то же что и я, только на С++, хоть с STL, хоть с сиськами, с чем угодно. Давай сравним простоту, понятность кода и конечно же количество использованных сущностей и их внутреннюю сложность. Только рабочий пример, а не сферического коня в вакууме. P>только давай ты сначала выдерешь из своего "рантайма" всё что необходимо для этого примера, и оформишь в виде одного файла, ок?
Ровно после того как ты выдернешь из STL в отдельный файлик, то что нужно тебе шоб написать аналогичный моему пример.
Здравствуйте, Alexéy Sudachén, Вы писали:
AS>>>Плюс несколько макросов расширяющих язык специальными конструкциями, которые локальны и на написание остального кода практически не влияют. Есть ровно одно правило — всё что осталось на пуле будет освобождено при выходе из маркированного блока, и никаких магических заклинаний. Макрос лишь просто вставка очистки пула в конец блока. В этом и есть существенный плюс в сравнении с двумя плюсами. P>>В чём, чём плюс? P>>Может в runtime overhead на освобождение ресурсов? AS>В C++ надо понимать освобождение ресурсов бесплатное. )
дешевле.
особенно в случаях где не могут быть выкинуты исключения — вообще бесплатно
AS>>>А ты вот попробуй. ))) Покажи своё владение силой, Люк. Напиши ровно то же что и я, только на С++, хоть с STL, хоть с сиськами, с чем угодно. Давай сравним простоту, понятность кода и конечно же количество использованных сущностей и их внутреннюю сложность. Только рабочий пример, а не сферического коня в вакууме. P>>только давай ты сначала выдерешь из своего "рантайма" всё что необходимо для этого примера, и оформишь в виде одного файла, ок? AS>Ровно после того как ты выдернешь из STL в отдельный файлик, то что нужно тебе шоб написать аналогичный моему пример.
STL — это стандарт
я же не сказал, чтобы ты декларации, а то и определения стандартных функций выдирал.
Здравствуйте, 11molniev, Вы писали:
P>>вы понимаете, что абстракции могут иметь разные реализации. и да, некоторые могут быть медленней. P>>но, у нас как бы разговор, и есть определённый контекст. P>>Конкретно я имею ввиду, что C++ позволяет писать более абстрактный, более безопасный, и более быстрый код — и всё это одновременно.
1>Дабы завершить наши препирательства: 1>Изначально я и обратил ваше внимание, на то, что С++ не позволяет писать более быстрые приложения, чем С. 1>http://www.rsdn.ru/poll/3562.aspx
1>К моей радости, большая часть аудитории данного форума это понимают. И я даже не знаю, как объяснить это вам, потому, что это фундаментальное знание — и если вы знаете С++, вы понимаете, почему так.
то что цитата в вопросе вырвана из контекста, я уже писал
"
Вопрос: С++ позволяет писать более быстрый код чем С?
1. Да 12
2. Нет 27
3. Этот аналогичный код на C, зачастую не пишется и оставляется не оптимальная версия 1
"
3 — относится к моей точки зрения
итого, мою точку зрения поддерживают 32.5% (даже при "плохой" постановке вопроса)
и?
Это распространённое заблуждение, что код на C более быстр и менее требователен. Если важна эффективность, C++ легко позволяет писать более оптимальные программы чем C.
что вам не ясно-то?
вы хотели подтвердить моё высказывание своим опросом?
1>Могу лишь понадеется, что в будущем, когда у вас будет больше опыта вы поймете, почему были неправы.
Здравствуйте, Piko, Вы писали:
P>Здравствуйте, 11molniev, Вы писали:
P>>>вы понимаете, что абстракции могут иметь разные реализации. и да, некоторые могут быть медленней. P>>>но, у нас как бы разговор, и есть определённый контекст. P>>>Конкретно я имею ввиду, что C++ позволяет писать более абстрактный, более безопасный, и более быстрый код — и всё это одновременно.
1>>Дабы завершить наши препирательства: 1>>Изначально я и обратил ваше внимание, на то, что С++ не позволяет писать более быстрые приложения, чем С. 1>>http://www.rsdn.ru/poll/3562.aspx
1>>К моей радости, большая часть аудитории данного форума это понимают. И я даже не знаю, как объяснить это вам, потому, что это фундаментальное знание — и если вы знаете С++, вы понимаете, почему так.
P>то что цитата в вопросе вырвана из контекста, я уже писал
Ну сделайте голосовалку не вырванную из контекста. Я чем этому мешаю?
P>итого, мою точку зрения поддерживают 32.5% (даже при "плохой" постановке вопроса) P>и?
Привет им. Мног8ие считают, что питон быстрей всех языков в мире. P>смотрим моё утверждение в этом топике:
Ваше утверждение это самый серьезный пруф, который я только видел. P>http://www.rsdn.ru/forum/cpp/4731645.aspx
P>Это распространённое заблуждение, что код на C более быстр и менее требователен. Если важна эффективность, C++ легко позволяет писать более оптимальные программы чем C.
P>что вам не ясно-то?
Мне не ясно, почему вы не думаете головой. пытаетесь противоречить фактам.
P>вы хотели подтвердить моё высказывание своим опросом?
Что 2/3 посетителей этого форума с вами совсем не согласны.
1>>Могу лишь понадеется, что в будущем, когда у вас будет больше опыта вы поймете, почему были неправы. P>аналогично
Ну подождем друг друга)))
Здравствуйте, 11molniev, Вы писали:
P>>>>вы понимаете, что абстракции могут иметь разные реализации. и да, некоторые могут быть медленней. P>>>>но, у нас как бы разговор, и есть определённый контекст. P>>>>Конкретно я имею ввиду, что C++ позволяет писать более абстрактный, более безопасный, и более быстрый код — и всё это одновременно.
1>>>Дабы завершить наши препирательства: 1>>>Изначально я и обратил ваше внимание, на то, что С++ не позволяет писать более быстрые приложения, чем С. 1>>>http://www.rsdn.ru/poll/3562.aspx
1>>>К моей радости, большая часть аудитории данного форума это понимают. И я даже не знаю, как объяснить это вам, потому, что это фундаментальное знание — и если вы знаете С++, вы понимаете, почему так.
P>>то что цитата в вопросе вырвана из контекста, я уже писал 1>Ну сделайте голосовалку не вырванную из контекста. Я чем этому мешаю?
а смысл? вот буквально ниже:
P>>итого, мою точку зрения поддерживают 32.5% (даже при "плохой" постановке вопроса) P>>и? 1>Привет им. Мног8ие считают, что питон быстрей всех языков в мире.
вы приравниваете людей разделяющих мою точку зрения к баранами
P>>смотрим моё утверждение в этом топике: 1>Ваше утверждение это самый серьезный пруф, который я только видел.
P>>Это распространённое заблуждение, что код на C более быстр и менее требователен. Если важна эффективность, C++ легко позволяет писать более оптимальные программы чем C.
P>>что вам не ясно-то? 1>Мне не ясно, почему вы не думаете головой. пытаетесь противоречить фактам.
каким фактам?
Ну так там где в C возможно compile-time, оно возможно и в C++, причём в C++ — оно достигается намного легче/лучше/красивее
Вы с этим согласны/не согласны?
P>>вы хотели подтвердить моё высказывание своим опросом? 1>Что 2/3 посетителей этого форума с вами совсем не согласны.
ну и?:
Это распространённое заблуждение, что код на C более быстр и менее требователен. Если важна эффективность, C++ легко позволяет писать более оптимальные программы чем C.
Здравствуйте, Piko, Вы писали:
P>Как я писал ранее — отсутствие компилятора действительно может затруднять использование С++, но как я уже писал есть компиляторы транслирующие код C++ в код C.
Это совсем не понятно. Такая сложная схема компиляции наверняка будет иметь накладные расходы всякие, надо бы понимать ради чего? Чем подмножество С++ так уж лучше С + анализатор кода?
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, Erop, Вы писали:
P>>Как я писал ранее — отсутствие компилятора действительно может затруднять использование С++, но как я уже писал есть компиляторы транслирующие код C++ в код C.
E>Это совсем не понятно. Такая сложная схема компиляции наверняка будет иметь накладные расходы всякие, надо бы понимать ради чего?
про какие именно накладные расходы вы говорите?
1. отсутствие оптимизации в некоторых местах, из-за того что теряется исходная C++ семантика?
2. накладные расходы во время разработки?
и да, я согласен использование таких схем трансляции может быть головной болью. в таких случаях лучше использовать те языки, для которых есть компилятор.
E>Чем подмножество С++ так уж лучше С + анализатор кода?
1. надёжность
2. безопасность
3. абстракции (зачастую абсолютно ничего не стоящие)
4. скорость программ
5. причём всё это, порождает меньше исходного кода чем C
Здравствуйте, Piko, Вы писали:
P>>>в. выедают stack V>>Это не обязательно проблема — например, если такой массив используется в многократно вызываемой фунцкции. Стек все равно освобождается в ее конце.
Даже если она inline?..
В С99 есть такие гарантии?
P>естественно, что полностью не уберёт, так как в С++ есть перегрузка функций(для каждой должно быть своё имя) и т.п.
В С++ extern "C" функции нельзя перегружать..
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, Erop, Вы писали:
P>>естественно, что полностью не уберёт, так как в С++ есть перегрузка функций(для каждой должно быть своё имя) и т.п. E>В С++ extern "C" функции нельзя перегружать..
я знаю
естественно, что полностью не уберёт, так как в С++ есть перегрузка функций(для каждой должно быть своё имя) и т.п. но ничто не мешает для С++ библиотеки, делать полностью clean-C интерфейс
Здравствуйте, Vamp, Вы писали:
V>Исключения делаются на setjmp. Автоматическое управление ресурсами — не знаю как. Впрочем, мне неизвестны языки с автоматическим управлением ресурсами, кроме С++.
В чём проблемы? Делаешь статического владельца ресурсами, при аллокации их там регишь, при деаллокации -- разрегистрируешь. Хранилище умеет делать с себя слепок и локальное на нить.
При входе в функцию -- делаешь слепок, при выходе -- откатываешься к нему.
Если не откатишься в этой, то откатишься в предыдущей...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, Erop, Вы писали:
V>>Исключения делаются на setjmp. Автоматическое управление ресурсами — не знаю как. Впрочем, мне неизвестны языки с автоматическим управлением ресурсами, кроме С++. E>В чём проблемы? Делаешь статического владельца ресурсами, при аллокации их там регишь, при деаллокации -- разрегистрируешь. Хранилище умеет делать с себя слепок и локальное на нить. E>При входе в функцию -- делаешь слепок, при выходе -- откатываешься к нему. E>Если не откатишься в этой, то откатишься в предыдущей...
Здравствуйте, Piko, Вы писали:
P>про какие именно накладные расходы вы говорите?
Ну, например, номер строчки в которой из двух версий исходника будет показывать макрос assert?
P>и да, я согласен использование таких схем трансляции может быть головной болью. в таких случаях лучше использовать те языки, для которых есть компилятор.
О том и речь...
E>>Чем подмножество С++ так уж лучше С + анализатор кода?
P>1. надёжность
Не очевидно.
P>2. безопасность
Это не понятно.
P>3. абстракции (зачастую абсолютно ничего не стоящие)
IMHO, это одинаково хорошо на любом языке. На С++ даже хуже, если твои абстракции не совместимы с моделью С++...
P>4. скорость программ
Это не понятно. По идее Вылизанная С-программа и вылизанная С++ программа должны быть одинаково быстры.
Тут скорее вопрос в цене этой скорости/вылизанности.
P>5. причём всё это, порождает меньше исходного кода чем C
Тоже ценность мутная.
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Это хорошо, но тут публичный форум. Ты знаешь, а кто-то может быть введён в заблуждение неудачной формулировкой...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, Erop, Вы писали:
P>>про какие именно накладные расходы вы говорите? E>Ну, например, номер строчки в которой из двух версий исходника будет показывать макрос assert?
смотря где препроцессор отработает..
P>>и да, я согласен использование таких схем трансляции может быть головной болью. в таких случаях лучше использовать те языки, для которых есть компилятор. E>О том и речь...
E>>>Чем подмножество С++ так уж лучше С + анализатор кода?
P>>1. надёжность E>Не очевидно.
меньше скрытых багов выявленных системой типов во время компиляции, отсутствие возможности сделать целые классы ошибок в принципе и т.п.
P>>2. безопасность E>Это не понятно.
да хотя бы сколько было уязвимостей из-за sprintf
P>>3. абстракции (зачастую абсолютно ничего не стоящие) E>IMHO, это одинаково хорошо на любом языке. На С++ даже хуже, если твои абстракции не совместимы с моделью С++...
на любом языке
да на том же C — в qsort: абстрагировались от типа данных и функции сравнения — и что получили?
P>>4. скорость программ E>Это не понятно. По идее Вылизанная С-программа и вылизанная С++ программа должны быть одинаково быстры. E>Тут скорее вопрос в цене этой скорости/вылизанности.
разумеется в цене. если цена это на порядок, а то и на несколько больший объём кода, то зачастую она не платится
опять: std::sort vs qsort
P>>5. причём всё это, порождает меньше исходного кода чем C E>Тоже ценность мутная.
P>смотря где препроцессор отработает..
А есть варианты
Как, по твоему, С будет транслировать С++ хедеры?..
P>>>1. надёжность E>>Не очевидно.
P>меньше скрытых багов выявленных системой типов во время компиляции, отсутствие возможности сделать целые классы ошибок в принципе и т.п.
Ну так это, С + анализатор же рассматривается?..
P>>>2. безопасность E>>Это не понятно.
P>да хотя бы сколько было уязвимостей из-за sprintf
Просто системного С++ кода мало, вот и уязвимостей мало
Опять же, анализаторы кода простые косяки, вроде ловят...
P>на любом языке P>да на том же C — в qsort: абстрагировались от типа данных и функции сравнения — и что получили?
ну просела немного производительность...
Было бы критично -- написали бы макрос...
P>разумеется в цене. если цена это на порядок, а то и на несколько больший объём кода, то зачастую она не платится
Значит скорость в этом месте не так уж и нужна...
Узких мест обычно мало...
P>опять: std::sort vs qsort
Да пофигу. Это редко влияет на скорость реальных программ...
А если уж в твоей проге критична какая-то сортировка, то всё равно скорее всего надо алгоритм адаптировать...
P>>>5. причём всё это, порождает меньше исходного кода чем C E>>Тоже ценность мутная.
P>опять: std::sort vs qsort, самый простой пример.
Он слишком синтетический... Кроме того, чисто IMHO, шаблоны и STL в обсуждаемое подмножество С++ не входят
Я, кстати, тоже сторонник "подмножества С++", а не голого С, но аргументы слабые какие-то...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Я так и не понял, какой неявный способ тут считают приемлемым...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, Alexéy Sudachén, Вы писали:
AS>Основная проблема С++ в том, что сопровождение кода стоит дороже его написания, и требует квалификации существенно выше чем у того, кто его писал. Такая вот парадоксальная зависимость. При условии же что чем программер лучше, тем меньше он хочет сопровождать чужой код... очевидно неинтересная.
Дык STL -- редкий урод. Это весьма распространённый взгляд. Впрочем, если не страдать и свести использование STL к контейнерам и простейшим алгоритмам, вроде sort и merge, то стоны по неподдерживаемости кода мне не ясны...
AS>От собственно это в реализации STL у меня и вызывает затруднения.
Ну его можно вообще не использовать...
Обычно, когда говорят о "С-подобном подмножестве С++", туда шаблоны не включают, так что STL точно в пролёте...
AS>Причём никакой скрытой логики я в общем-то не добавил.
Ну логики не добавил, а запутанности добавил... Это большой шаг в сторону write-only плюсов от сурового, но справедливого С! бойся, комрад! Программисты уже один раз ошиблись, отойдя от православного FORTRAN в сторону всяких богомерзких MODULA, PASCAL и С... Не повторяй ошибок прошлого! Стойко держись С! И выкини все эти макросы, они делают из твоего С жалкое подобие С++. Истина состоит в том, что автоматический RAII не нужен, а не в том, что путём кучи трюков его можно воспроизвести в С1
AS>С++ же такое сделать в принципе невозможно, в силу концепции языка, а если бы и можно было это пошло бы в разрез с Единственным Истинно Верным Способом Программировать. )))
Тут ты не прав. Как учит самый главный страус-гуру, С++ -- он мультипарадигменный, там нет единственно-верного способа. Это один из его недостатков. Менеджер проекта должен ещё и парадигму выбрать, и как-то отследить, что кодеры ей следуют
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, Piko, Вы писали:
P>синтаксический онанизм/не онанизм — это сугубо субъективные оценки, поэтому я и сделал опрос. AS>>Кстати, показательно что 3 человека язык таки знают. P>Знают? или просто не считают это синтаксическим онанизмом?
Парни! В онанизме я не спец, но обсуждаемая вами макропись плоха тем, что при минимально неожиданном использовании всё посыплется!
Скажем, если я хочу иногда выходить из блока с кодом ошибки, то мне уже надо глянуть под капот и сделать чего-то и как-то хитро.
То есть мне код вида
void foo()
{
ResuorcePullState rps = ResuorcePullStart();
/* тут код, вида */
MyData* data = ResuorcePullPush( alloc( sizeof( MyData ) * count ) );
free( ResuorcePullPop( data ) ); /* Это если таки надо, вообще-то не надо обычно */
/* для ресурсов каких-то других типов пишем как-то так: */
MyResuorce* dialog = ResourcePullPushExt( LoadResource( ... ), CloseHandle );
/* ну и в конце пишем как-то так: */
ResourcePullEnd( rps );
}
намного больше нравится, так как он банально рефакторится в такой:
HRes foo()
{
ResuorcePullState rps = ResuorcePullStart();
/* тут код, вида */
MyData* data = ResuorcePullPush( alloc( sizeof( MyData ) * count ) );
free( ResuorcePullPop( data ) ); /* Это если таки надо, вообще-то не надо обычно */if( что-то не так )
return ResourcePullEnd( rps ), HRES_SOME_ERROR;
/* для ресурсов каких-то других типов пишем как-то так: */
MyResuorce* dialog = ResourcePullPushExt( LoadResource( ... ), CloseHandle );
/* ну и в конце пишем как-то так: */return ResourcePullEnd( rps ), HRES_OK;
}
Ну и в RT можно в каком-нибудь отладочном режиме пула, проверять, что ResourcePullEnd всегда откатывает только одну ResuorcePullStart...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
AS>Ровно после того как ты выдернешь из STL в отдельный файлик, то что нужно тебе шоб написать аналогичный моему пример.
STL НЕ НУЖЕН!
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, Alexéy Sudachén, Вы писали:
AS>Ну дык, да. У языка нет единственно верного способа, а у каждого, кто его пользует не сильно много лет, точно есть. )))
Не у каждого, у хороших инженеров нет, зато есть аргументы за и против каждого подхода. Но хороших мало...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Если это про тот __Auto_Release__{ тут код }, то лучше не надо
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, Piko, Вы писали:
P>>>то что цитата в вопросе вырвана из контекста, я уже писал 1>>Ну сделайте голосовалку не вырванную из контекста. Я чем этому мешаю?
P>а смысл? вот буквально ниже:
P>>>итого, мою точку зрения поддерживают 32.5% (даже при "плохой" постановке вопроса) P>>>и? 1>>Привет им. Мног8ие считают, что питон быстрей всех языков в мире.
P>вы приравниваете людей разделяющих мою точку зрения к баранами
Нет, просто я обращаю внимание, что большинство участников этого форума имеют значительный опыт и знание, и их мнение стоит слышать. И ставить выше мнения отдельных товарищей.
P>>>смотрим моё утверждение в этом топике: 1>>Ваше утверждение это самый серьезный пруф, который я только видел.
P> P>у вас в голове контекст вообще мизерный, что-ли?
Так вы в той ветки так и не смогли написать код на С++, быстрей кода на С.
Ваше аргументы это некорректный тест (в корректном мы с вами скорости кода на С и С++ сравняли) и ваше собственное утверждение, которое вы повторяете от сообщения к сообщению.
И после этого замолчали на долгое время.
P>>>http://www.rsdn.ru/forum/cpp/4731645.aspx
P>>>Это распространённое заблуждение, что код на C более быстр и менее требователен. Если важна эффективность, C++ легко позволяет писать более оптимальные программы чем C.
P>>>что вам не ясно-то? 1>>Мне не ясно, почему вы не думаете головой. пытаетесь противоречить фактам. P>каким фактам?
1. Любой код на С++ представим эквивалентным кодом на С.
2. Код на С++ и эквивалентный на С при компиляции дадут идентичный машинный код (если вы знаете, что это).
3. Идентичный машинный код имеет идентичную скорость.
По поводу первого факта: вспоминайте декорирование функций при линковке, cfront & co.
P>
P>Ну так там где в C возможно compile-time, оно возможно и в C++, причём в C++ — оно может достигается намного легче/лучше/красивее, а может намного тяжелее/хуже/уродливей
P>Вы с этим согласны/не согласны?
Да, с исправленным мной согласен.
Что это за дурь? Намного лучше — идеальный инструмент.
P>>>вы хотели подтвердить моё высказывание своим опросом? 1>>Что 2/3 посетителей этого форума с вами совсем не согласны.
P>ну и?: P>
P>Это распространённое заблуждение, что код на C более быстр и менее требователен. Если важна эффективность, C++ легко позволяет писать более оптимальные программы чем C.
Вы повторяете это как мантру только на этом форуме, каждое сообщение, или в жизне тоже? Я не хочу вас обидеть, но ИМХО: у вас нет опыта практической работы. А информацию о распространеном заблуждении вы почерпнули из книжки/лекций/форумов.
PS. Либо аргументируйте свою позицию, либо спорьте ещё с кем то. Меня аргументы, что это распространенное заблуждение совсем не впечатляют.
_>1. Большую часть времени я пишу для платформы с большим ограничением по пространству-времени. ( робототехника )
Что за процессоры/операционки? В смысле, есть ли там нормальные С++ кросс-компиляторы вообще?
Я так понимаю, что не кросс-компилер С++, в виду чахлости платформы малореален?
_>2. При написании игр долгое время приходилось поддерживать огромное число "слабых" машин. ( и да! можете убить меня, я пишу на голом WinAPI )
Тут не понятно, чем С++ хуже С. Ну рантайм библиотека чуть больше, конечно, но это же мелочь...
_>5. В большинстве моих проектов и задач использование С++ равносильно "стрельбе из пушки по воробьям".
Это тоже не понятно. Ты хуже знаешь С++? У тебя плохая IDE/компилятор/отладчик/что-то ещё из среды разработки для С++? Чем С-подобное подмножество С++ более пушка, чем С?
_>10. Аргументны типа: можно писать Cи-like коде в самом C++ — тоже не аргумент, довелось работать в таких проектах. Половина кода на кривом С++, половина на Си, большая часть кода — вообще сторонние библиотеки на С++ со своей, невообразимой семантикой. В результате куча костылей, граблей и прочей фигни.
Ну так можно использовать только кошерные С-библиотеки. Хотя, IMHO, есть кривые библиотеки и прямые. Надо не использовать первые и использовать вторые, подмножество С++ в этом плане, казалось бы, даёт БОЛЬШЕ возможностей, а не меньше...
_>12. Вся RMOS ( моя система для экспериментальных роботов-манипуляторов ) написана на С99. Далее LCC->AT89C51. ( лицензия есть ).
Про "далее" не понял, но как факт того, что RMOS написана на С99 помогает сравнить с-подобное подмножество С++ и С?
Скажем, если ты пересоберёшь RMOS, как С++ проект, то что будет?
Пока что я понял так, что есть три более или менее понятных мне аргумента.
1) С чисто С-проектом проще управляться менеджеру. Проще следить за кодерами, проще верефицировать соблюдение инструкций, проще набирать персонал и т. д...
И даже если проект делается одним человеком, управлять им всё равно проще. Типа бери и пиши, и не надо парится над кодестилями и допустимыми и нет средствами языка
2) Библиотеки для С в среднем лучше. Правда мне не ясно, что мешает юзать их же из подмножества С++
и 3) должен содержаться в ответе на это:
_>4. Я использую и С++ как вариант подмножества Си в нём, почти не загружая код архитектурными излишествами, но часто сталкивался с кривой реализацией, и не возможностью поддерживать "чистый" Си ( без серьёзного допила )... Очень интересно посмотреть конкретные примеры, хотя бы описания ситуаций.
То, что код без излишеств -- это хорошо в любом языке
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
E>Вопрос не в принципиальной возможности, а в цене разработки. Иногда цена столь велика, что является запретительной...
Позволю себе частично с вами не согласиться, все достаточно сильно зависит от решаемых задач. Бесспорно, грамотный код на С++, при реализации дублирующихся функций будет компактней, безопасней и во всех остальных отношениях (кроме, возможно сложности) лучше. Но если функциональность не дублируется или дублируется с мелкими изменениями, выходит, что приплюснутого кода получается больше, иногда ещё и с ущербом для скорости и читабельности.
Если уж совсем грубо, то плюсы можно сравнить с архиватором — сжатие (улучшение параметров) зависит от контента и результат может оказаться больше оригинала (при этом ещё и время на распаковку будет тратиться).
Здравствуйте, Erop, Вы писали:
P>>смотря где препроцессор отработает.. E>А есть варианты E>Как, по твоему, С будет транслировать С++ хедеры?..
естественно, а к чему тогда вопрос про макрос assert?
P>>>>1. надёжность E>>>Не очевидно. P>>меньше скрытых багов выявленных системой типов во время компиляции, отсутствие возможности сделать целые классы ошибок в принципе и т.п. E>Ну так это, С + анализатор же рассматривается?..
анализатор может поймать хотя бы 10% того, что ловится в C++ compile-time?
P>>>>2. безопасность E>>>Это не понятно.
P>>да хотя бы сколько было уязвимостей из-за sprintf E>Просто системного С++ кода мало, вот и уязвимостей мало E>Опять же, анализаторы кода простые косяки, вроде ловят...
вы прочитали статью? в каком случае уязвимости более вероятны?
вы считаете примеры надуманны?
P>>на любом языке P>>да на том же C — в qsort: абстрагировались от типа данных и функции сравнения — и что получили? E>ну просела немного производительность... E>Было бы критично -- написали бы макрос... P>>разумеется в цене. если цена это на порядок, а то и на несколько больший объём кода, то зачастую она не платится E>Значит скорость в этом месте не так уж и нужна... E>Узких мест обычно мало... P>>опять: std::sort vs qsort E>Да пофигу. Это редко влияет на скорость реальных программ... E>А если уж в твоей проге критична какая-то сортировка, то всё равно скорее всего надо алгоритм адаптировать...
ну вот пример: http://eigen.tuxfamily.org/index.php?title=Main_Page
чтобы реализовать тоже самое на C, понадобится раз в 100 больше кода
P>>>>5. причём всё это, порождает меньше исходного кода чем C E>>>Тоже ценность мутная. P>>опять: std::sort vs qsort, самый простой пример. E>Он слишком синтетический...
Почему синтетический? реальный пример, из реальных библиотек
Итак, в C++ мы получили более надёжный, безопасный, быстрый, код с меньшим объёмом, так?
E>Кроме того, чисто IMHO, шаблоны и STL в обсуждаемое подмножество С++ не входят
это почему не входят? может ещё STL выкинем?
даже без "мета"программирования у шаблонов большая область применимости
E>Я, кстати, тоже сторонник "подмножества С++", а не голого С, но аргументы слабые какие-то...
Здравствуйте, Erop, Вы писали:
P>>Конкретно я имею ввиду, что C++ позволяет писать более абстрактный, более безопасный, и более быстрый код — и всё это одновременно. E>Но очень мало кто умеет это делать. Кроме того, если вернуться к реальности, то кодер. который хреначит тысячи строк простого С-подобного кода в день и выдаёт приемлемое качество, намного дешевле мегаперца, который вам всё супер-пупер спроектирует и реализует, так, что это будет более абстрактный, безопасный и быстрый код одновременно, и не write-only при этом
плохих C++ программистов много — я не спорю, может даже больше чем (относительно, в процентах) плохих C программистов — и это действительно печалька. И это кстати во многом из-за того, что эти плохие программисты C++ получаются из-за C бэкграунда, или C-style обучения.
Но мы ведь здесь говорим не о плохих, не так ли?
а на счёт скорости разработки — сколько времени этот средний программист C убьёт на отладку?
E>Кстати, то, что код более абстрактный, часто не является ценностью. Ценностью является естественность выражения бизнес-логики в реалиях программы и кода
а как вы выразите бизнес логику без абстракций? Как на C, вы выразите сложение двух разряженный матриц?
А как вы делаете большие и средние проекты, если без абстракций? Каждый уровень абстракции увеличивает на порядок то, что можно выразить
Здравствуйте, 11molniev, Вы писали:
P>>>>то что цитата в вопросе вырвана из контекста, я уже писал 1>>>Ну сделайте голосовалку не вырванную из контекста. Я чем этому мешаю? P>>а смысл? вот буквально ниже: P>>>>итого, мою точку зрения поддерживают 32.5% (даже при "плохой" постановке вопроса) P>>>>и? 1>>>Привет им. Мног8ие считают, что питон быстрей всех языков в мире. P>>вы приравниваете людей разделяющих мою точку зрения к баранами 1>Нет, просто я обращаю внимание, что большинство участников этого форума имеют значительный опыт и знание, и их мнение стоит слышать. И ставить выше мнения отдельных товарищей.
то есть 67.5% имеют значительный опыт и знание, а 32.5% это бараны?
Здравствуйте, 11molniev, Вы писали:
P>>>>смотрим моё утверждение в этом топике: 1>>>Ваше утверждение это самый серьезный пруф, который я только видел. P>> P>>у вас в голове контекст вообще мизерный, что-ли? 1>Так вы в той ветки так и не смогли написать код на С++, быстрей кода на С.
1>> P>Так что быстрее? std::sort (C++ style) vs qsort (C-style) ?
1>> Они идентичны, если речь идёт о стандарте, Если не стандарт, то некоторые
1>> реализации qsort сливают.
MZ>Как бы ты не прав. Они НЕ идентичны. С++ный шаблоный код потенциально
MZ>быстрее, т.к. там возможно встраивание кода функции сравнения, и
MZ>прочие оптимизации, отсюда вытекающие. Также С++ный код знает
MZ>ТИП массива, а С-шный -- не знает. Тоже могут быть оптимизации.
MZ>Конечно, С-шный код в принципе тоже может это соптимизнуть,
MZ>но только это должен быть ОЧЕНЬ умный компилятор.
а теперь конкретно про тот пример, сколько кода добавится в вашем случае если нужно отсортировать ещё float'ы, double'ы, несколько структур? И сколько в случае C++?
P>>>>Это распространённое заблуждение, что код на C более быстр и менее требователен. Если важна эффективность, C++ легко позволяет писать более оптимальные программы чем C.
P>>>>что вам не ясно-то? 1>>>Мне не ясно, почему вы не думаете головой. пытаетесь противоречить фактам. P>>каким фактам? 1>1. Любой код на С++ представим эквивалентным кодом на С. 1>2. Код на С++ и эквивалентный на С при компиляции дадут идентичный машинный код (если вы знаете, что это). 1>3. Идентичный машинный код имеет идентичную скорость.
4. эквивалентный код на C может быть в 10/100/1000 раз больше, и зачастую не пишется
P>>
P>>Ну так там где в C возможно compile-time, оно возможно и в C++, причём в C++ — оно может достигается намного легче/лучше/красивее
P>>Вы с этим согласны/не согласны? 1>Да, с исправленным мной согласен.
вы исправили мой текст, facepalm..
"а может намного тяжелее/хуже/уродливей"
как оно вообще может достигаться уродливей, если C по большей части является подмножеством C++ ?
P>>>>вы хотели подтвердить моё высказывание своим опросом? 1>>>Что 2/3 посетителей этого форума с вами совсем не согласны.
P>>ну и?: P>>
P>>Это распространённое заблуждение, что код на C более быстр и менее требователен. Если важна эффективность, C++ легко позволяет писать более оптимальные программы чем C.
1>Вы повторяете это как мантру только на этом форуме, каждое сообщение, или в жизне тоже? Я не хочу вас обидеть, но ИМХО: у вас нет опыта практической работы. А информацию о распространеном заблуждении вы почерпнули из книжки/лекций/форумов.
мне не раз отвечали на вопрос почему они не используют средства C++, тем что считают их медленными. на что, я показывал идентичный ассемблерный листинг при намного меньшем коде
на ваше имхо, могу ответить "аналогичным" своим: вы вообще не написали строчки кода C++
и к чему это?
1>PS. Либо аргументируйте свою позицию, либо спорьте ещё с кем то. Меня аргументы, что это распространенное заблуждение совсем не впечатляют.
"распространённое заблуждение" — это пояснение к результатам голосования
Здравствуйте, Erop, Вы писали:
E>Плохо, что мало есть средств автоматического ограничения С++ таким образом. E>Я бы, например, как менеджер, хотел бы иметь в С++ проекте какой-то профиль, в котором было бы размечено, чего из зыка можно юзать, а чего нет. И на выход в каком-то куске кода в продакшен-сборке, требовалась бы цыфровая подпись куска каким-то начальником или экспертом... E>Но такого рода инструментов в С++ вообще нет...
я кстати тоже думал об запрете некоторых возможностей, либо изоляцию их в строгом месте проекта, чтобы легче контролировать.
Или даже не запрет, а просто тулза, которая будет говорить как "пахнет" код и где. clang кстати здесь рулит, советую посмотреть.
1>>Если уж совсем грубо, то плюсы можно сравнить с архиватором — сжатие (улучшение параметров) зависит от контента и результат может оказаться больше оригинала (при этом ещё и время на распаковку будет тратиться). E>Ну так это только при бездумном использовании инструмента. Причём любого. В микроскоп прекрасно видно бактерии, но орехи им колоть неудобно, а соседское окно, так и вовсе не видно...
Здравствуйте, Piko, Вы писали:
P>анализатор может поймать хотя бы 10% того, что ловится в C++ compile-time?
AFAIK, намного больше. Например анализаторы ловят большинство багов в использовании printf и компании
P>вы прочитали статью? в каком случае уязвимости более вероятны? P>вы считаете примеры надуманны?
Я считаю, что автор несколько однобоко смотрит на проблему.
Реальность такова, что если хочешь безопасности, то код надо целенаправленно безопасно писать, и потом ломать для проверки, просто выбором языка безопасность не получишь...
E>>А если уж в твоей проге критична какая-то сортировка, то всё равно скорее всего надо алгоритм адаптировать...
P>ну вот пример: P>http://eigen.tuxfamily.org/index.php?title=Main_Page P>чтобы реализовать тоже самое на C, понадобится раз в 100 больше кода
Чушь прекрасные библиотеки линейной алгебры были уже на FORTRAN...
Просто на С и на полноценном С++ библиотеки проектируют по разному.
Я уже не говорю про то, что eigen выходит далеко за рамки "С подобного подмножества С++"...
Так что это вообще офтопик, как и std::sort vs qsort
P>Почему синтетический? реальный пример, из реальных библиотек P>Итак, в C++ мы получили более надёжный, безопасный, быстрый, код с меньшим объёмом, так?
Нет, не так. Если рассматривать всё в целом, то он нифига не обязательно ни более быстрый, ни более надёжный, ни с меньшим объёмом.
Но я считаю, что это проблемы не всего С++, а конкретно STL.
P>это почему не входят? может ещё STL выкинем? P>даже без "мета"программирования у шаблонов большая область применимости
Ну ты сам, вроде как, поставил вопрос так, что не понимаешь, почему вместо С не используют некое подмножество С++...
Конкретно шаблоны плохи тем, что не дают вообще никаких гарантий работоспособности программы. Поэтому я бы в надёжном кодеих избегал бы, например. Ну, быть может, кроме самых-самых нужных/проверенных...
P>ну реально подмножество С++ + тесты не особо лучше С + анализатор + тесты...
Такой вот вывод. Лучше, но в мелочах. А в чём-то хуже может быть.
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, Piko, Вы писали:
P>а на счёт скорости разработки — сколько времени этот средний программист C убьёт на отладку?
Не факт, что больше, чем С++...
У С-шника будет больше строчек, зато ошибки все будут простые, а у С++ника строчек булет меньше, зато ошибки будут заковыристее...
P>а как вы выразите бизнес логику без абстракций? Как на C, вы выразите сложение двух разряженный матриц?
AddBlaBlaBlaMatrix( &matrix1, &matrix2 );
P>А как вы делаете большие и средние проекты, если без абстракций? Каждый уровень абстракции увеличивает на порядок то, что можно выразить
С уровням абстракции вроде как не мешает... Вообще, уровни абстракции -- это скорее к голове архитектора, а не к языку...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, Erop, Вы писали:
P>>анализатор может поймать хотя бы 10% того, что ловится в C++ compile-time? E>AFAIK, намного больше.
я
E>Например анализаторы ловят большинство багов в использовании printf и компании
да ловят, видел.
что на счёт преобразований от void* ?
P>>вы прочитали статью? в каком случае уязвимости более вероятны? P>>вы считаете примеры надуманны? E>Я считаю, что автор несколько однобоко смотрит на проблему. E>Реальность такова, что если хочешь безопасности, то код надо целенаправленно безопасно писать, и потом ломать для проверки, просто выбором языка безопасность не получишь...
да, просто выбором не получишь — надо правильно готовить.
Но, разве по вашему мнению C++ не позволяет писать более безопасные программы легче?
E>>>А если уж в твоей проге критична какая-то сортировка, то всё равно скорее всего надо алгоритм адаптировать... P>>ну вот пример: P>>http://eigen.tuxfamily.org/index.php?title=Main_Page P>>чтобы реализовать тоже самое на C, понадобится раз в 100 больше кода E>Чушь прекрасные библиотеки линейной алгебры были уже на FORTRAN...
Because of the code reuse provided by generic programming, MTL has an order of magnitude fewer lines of code than the Netlib Fortran BLAS [20] | while providing much greater functionality and achieving signicantly better performance. The MTL has 8,284
lines of code for its algorithms and 6,900 lines of code for its dense containers, while the Fortran BLAS total 154,495 lines of code. High performance versions of the BLAS (with which MTL is competitive) are even more verbose.
если надо, ещё подобных примеров приведу.
какова цена этих прекрасных библиотек на Fortran?
E>Просто на С и на полноценном С++ библиотеки проектируют по разному.
естественно
E>Я уже не говорю про то, что eigen выходит далеко за рамки "С подобного подмножества С++"...
а я говорю про С++, а не про его подмножество.
E>Так что это вообще офтопик, как и std::sort vs qsort
почему? очень яркий пример
P>>Почему синтетический? реальный пример, из реальных библиотек P>>Итак, в C++ мы получили более надёжный, безопасный, быстрый, код с меньшим объёмом, так? E>Нет, не так. Если рассматривать всё в целом, то он нифига не обязательно ни более быстрый, ни более надёжный, ни с меньшим объёмом.
нет, ну вот опять std::sort vs qsort, разве не так?
E>Но я считаю, что это проблемы не всего С++, а конкретно STL.
какие проблемы?
P>>это почему не входят? может ещё STL выкинем? P>>даже без "мета"программирования у шаблонов большая область применимости E>Ну ты сам, вроде как, поставил вопрос так, что не понимаешь, почему вместо С не используют некое подмножество С++...
где? и какой там контекст был?
E>Конкретно шаблоны плохи тем, что не дают вообще никаких гарантий работоспособности программы. Поэтому я бы в надёжном кодеих избегал бы, например. Ну, быть может, кроме самых-самых нужных/проверенных...
каких гарантий нет в std::sort? в std::vector?
P>>ну реально подмножество С++ + тесты не особо лучше С + анализатор + тесты... E>Такой вот вывод. Лучше, но в мелочах. А в чём-то хуже может быть.
Здравствуйте, Piko, Вы писали:
P>>>а как вы выразите бизнес логику без абстракций? Как на C, вы выразите сложение двух разряженный матриц? E>>AddBlaBlaBlaMatrix( &matrix1, &matrix2 );
и кстати, что в вашем случае возвращает AddBlaBlaBlaMatrix ?
Здравствуйте, Piko, Вы писали:
P>Но, разве по вашему мнению C++ не позволяет писать более безопасные программы легче?
Фиг его знает. Нужна статистика по уязвимостям в С-программах и в С++
Я сильно не уверен, где ситуация будет хуже...
P>да, да, знаю такое мнение.
Это не мнение. Это факт.
Я выч. математик по образованию
P>
P>Because of the code reuse provided by generic programming, MTL has an order of magnitude fewer lines of code than the Netlib Fortran BLAS [20] | while providing much greater functionality and achieving signicantly better performance. The MTL has 8,284
P>lines of code for its algorithms and 6,900 lines of code for its dense containers, while the Fortran BLAS total 154,495 lines of code. High performance versions of the BLAS (with which MTL is competitive) are even more verbose.
P>если надо, ещё подобных примеров приведу.
Ну так то таки FORTRAN, а не С даже... P>какова цена этих прекрасных библиотек на Fortran?
Ну их написали вполне подъёмные задачи оказались. Таки на FORTRAN вычматы писать проще, чем на С++, а там вообще с переиспользованием не всё хорошо.
P>а я говорю про С++, а не про его подмножество.
С++ в целом значительно сложнее и я не знаю что окажется дешевле, 154 КLOC на FORTRAN или 8 КLOC шаблонов С++.
Особенно, если ты не переписываешь уже распаханную вдоль и поперёк тему на шаблоны, и, таким образом, можешь заюзать команду классных программистов, а разрабатываешь библиотеку с нуля, то есть тебе нужны скорее спецы по ленейке и по архитектурам, а не по плюсам. То есть, что бы писать такую библу с нуля, нужно набрать каких-то классных вычматематиков, которые ещё и крутые С+ники, что может быть сколь угодно дороже, просто спецов в линейке, которые немного знают FORTRAN...
P>почему? очень яркий пример
Потому, что разговор о С++ vs С вообще ни о чём. Они слишком разные. Это типа как спрашивать, что лучше, джип или трактор. Где-то джип, а где-то трактор...
E>>Нет, не так. Если рассматривать всё в целом, то он нифига не обязательно ни более быстрый, ни более надёжный, ни с меньшим объёмом. P>нет, ну вот опять std::sort vs qsort, разве не так?
Не так. Либо ты юзаешь уродские STL'ные коллекции, либо пишешь свои, как минимум итераторы, либо работаешь на голых указателях. Так что упс, одновременно быстрее, надёжнее и компактнее не получится. Возможно получится выбрать какие-то два из трёх, и то я до конца не уверен
P>какие проблемы?
Что не получится...
P>где? и какой там контекст был?
Мне лень искать, где-то близко к корню этой ветки. И я не уверен до конца, что это был ты. Суть была такая, что задали фанатичным приверженцам С вопрос, почему таки С, а не подмножество С++?
P>каких гарантий нет в std::sort? в std::vector?
Да никаких нет. Сунь в std::vector std::auto_ptr и узнаешь, есть гарантии или как
P>>>ну реально подмножество С++ + тесты не особо лучше С + анализатор + тесты... E>>Такой вот вывод. Лучше, но в мелочах. А в чём-то хуже может быть.
P>выделенное вроде я не говорил
Да, это сбой КУВТа. Это я такой вывод делаю из обсуждения...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
MZ>>Конечно, С-шный код в принципе тоже может это соптимизнуть,
MZ>>но только это должен быть ОЧЕНЬ умный компилятор.
Не такой уж и умный, просто внутренняя функция. memcpy же оптимизируют...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, Piko, Вы писали:
P>а теперь конкретно про тот пример, сколько кода добавится в вашем случае если нужно отсортировать ещё float'ы, double'ы, несколько структур? И сколько в случае C++?
и все три сортировки критичны по времени? Что это за программа такая?
Скорее всего критична какая-то одна, например float'ы. А остальные две пофигу как сортировать, то есть qsort...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
P>на C++ можно делать так: P>(m1+m2+m3)*m4*v1, P>а что будет на C?
О! Если ещё и лениво это всё делать... там за фасадом такое пиршество духа....
И чем мешает написать функцию Сделать_Нужное_Нам_Вычисление(v1,m4,m1,m2,m3,...) без всякой магии и предельно оптимально? Например с распараллеливанием по ядрам и/или поддержкой разреженных матриц?! Или это всё про сферического коня в вакууме?
Здравствуйте, Piko, Вы писали:
P>у C-шника будут и простые ошибки, и заковыристые. У C++ника простые ошибки поймает компилятор (при правильном использовании C++). P>хотите верьте, хотите нет, имхо таким абстрактным спором мы не убедим друг друга.. P>думаете на C будут только простые ошибки — ну ваше право
Да нет, С++ убьёт некий класс простых ошибок, которые, кстати, часто ловятся анализаторами или тестами, зато добавит сложных, специфически приплюснутых. С-то прост, как барабан, а вот про С++ так не скажешь...
E>>AddBlaBlaBlaMatrix( &matrix1, &matrix2 );
P>ну вот и я о том же — ну очень выразительно.
А что тут не понятно?
IMHO, очень даже выразительно.
P>а теперь сложите три матрицы, умножьте на четвёртую, потом на вектор. да причём так, чтобы сложение трёх матриц было эффективным, не (первая + вторая)+третья, а именно одновременно. P>на C++ можно делать так: P>(m1+m2+m3)*m4*v1, P>а что будет на C?
На С++ это будет эффективно, если повезёт, там автор класса матриц не заленится прикрутить шаблоны выражений, а потом все эти шаблонные навороты не дадут осечки, и компилятор не слажает и оптимизатор и т. д...
А вот на С будет CUDAшное ядро и соотвтествующий вызов...
P>да, но в C++ больше средств выражения абстракций P>и при этом они: P>
P>3. абстракции (зачастую абсолютно ничего не стоящие)
Ну в С средств УЖЕ ДОСТАТОЧНО. Проверено опытом программирования. В С++ их намного больше и они лучше, только часто всё равно абстракции задачи не хотят ложиться на абстракции С++, и всё равно слои дырявые выходят...
У С свои проблемы, у С++ -- свои. Но и та и другая машина ездят.
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, Alexéy Sudachén, Вы писали:
AS>И чем мешает написать функцию Сделать_Нужное_Нам_Вычисление(v1,m4,m1,m2,m3,...) без всякой магии и предельно оптимально? Например с распараллеливанием по ядрам и/или поддержкой разреженных матриц?! Или это всё про сферического коня в вакууме?
Речь про другое. Что мы что-то автоматизируем. То есть мы типа берём какие-то матрицы, как-то их хаполняем, пишем какие-то выражения, почти, как на доске или в блокное и чего-то там получаем.
только так не выходит, ручками всё равно выходит лучше пока что.
А если не ручками, а нормально оптимизировать матричные вычисления надо, то это не в С++ надо, а в вольфрам-математику...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
P>>Because of the code reuse provided by generic programming, MTL has an order of magnitude fewer lines of code than the Netlib Fortran BLAS [20] | while providing much greater functionality and achieving signicantly better performance. The MTL has 8,284
P>>lines of code for its algorithms and 6,900 lines of code for its dense containers, while the Fortran BLAS total 154,495 lines of code. High performance versions of the BLAS (with which MTL is competitive) are even more verbose.
P>>если надо, ещё подобных примеров приведу. E>Ну так то таки FORTRAN, а не С даже...
И какой вывод из этого?
На C кода может быть даже больше
P>>какова цена этих прекрасных библиотек на Fortran? E>Ну их написали вполне подъёмные задачи оказались.
если есть 1e9$ многие задачи становятся подъёмными
E>Таки на FORTRAN вычматы писать проще, чем на С++, а там вообще с переиспользованием не всё хорошо.
вы понимаете, что если C++ позволяет писать более выразительные вычислительные алгоритмы, которые по скорости не уступают Fortran'у, то C тут вообще делать нечего
P>>а я говорю про С++, а не про его подмножество. E>С++ в целом значительно сложнее и я не знаю что окажется дешевле, 154 КLOC на FORTRAN или 8 КLOC шаблонов С++. E>Особенно, если ты не переписываешь уже распаханную вдоль и поперёк тему на шаблоны, и, таким образом, можешь заюзать команду классных программистов, а разрабатываешь библиотеку с нуля, то есть тебе нужны скорее спецы по ленейке и по архитектурам, а не по плюсам. То есть, что бы писать такую библу с нуля, нужно набрать каких-то классных вычматематиков, которые ещё и крутые С+ники, что может быть сколь угодно дороже, просто спецов в линейке, которые немного знают FORTRAN...
Тут вопрос в то что возможно ли вообще или нет.
C++ на порядок по объёму кода смог обогнать Fortran, специально заточенный под вычисления.
С тут и рядом не стоит.
P>>почему? очень яркий пример E>Потому, что разговор о С++ vs С вообще ни о чём. Они слишком разные. Это типа как спрашивать, что лучше, джип или трактор. Где-то джип, а где-то трактор...
ну особенно учитывая что большая часть C входит в C++
E>>>Нет, не так. Если рассматривать всё в целом, то он нифига не обязательно ни более быстрый, ни более надёжный, ни с меньшим объёмом. P>>нет, ну вот опять std::sort vs qsort, разве не так? E>Не так. Либо ты юзаешь уродские STL'ные коллекции, либо пишешь свои, как минимум итераторы, либо работаешь на голых указателях. Так что упс, одновременно быстрее, надёжнее и компактнее не получится. Возможно получится выбрать какие-то два из трёх, и то я до конца не уверен
При чём тут указатели? Фишка в том что операции над итераторами мэпятся в одну-несколько ассемблеровских инструкций
Вы листинг посмотрите.
E>>>Но я считаю, что это проблемы не всего С++, а конкретно STL. P>>какие проблемы? E>Что не получится...
что не получится?
P>>каких гарантий нет в std::sort? в std::vector? E>Да никаких нет. Сунь в std::vector std::auto_ptr и узнаешь, есть гарантии или как
не было встроенного (был "не встроенный") move синтаксиса, и что?
это место конкретно косяк auto_ptr, а не vector.
в новом стандарте, уже есть и move, и unique_ptr
Здравствуйте, Erop, Вы писали:
P>>а теперь конкретно про тот пример, сколько кода добавится в вашем случае если нужно отсортировать ещё float'ы, double'ы, несколько структур? И сколько в случае C++? E>и все три сортировки критичны по времени? Что это за программа такая? E>Скорее всего критична какая-то одна, например float'ы. А остальные две пофигу как сортировать, то есть qsort...
так зачем вообще платить больше, если автоматом можно получить быстрее?
Здравствуйте, Alexéy Sudachén, Вы писали:
P>>на C++ можно делать так: P>>(m1+m2+m3)*m4*v1, P>>а что будет на C? AS>О! Если ещё и лениво это всё делать... там за фасадом такое пиршество духа....
естественно лениво
как не лениво получить вот это:
да причём так, чтобы сложение трёх матриц было эффективным, не (первая + вторая)+третья, а именно одновременно.
?
AS>И чем мешает написать функцию Сделать_Нужное_Нам_Вычисление(v1,m4,m1,m2,m3,...) без всякой магии и предельно оптимально? Например с распараллеливанием по ядрам и/или поддержкой разреженных матриц?! Или это всё про сферического коня в вакууме?
ага, на каждое вычисление, под каждого пользователя писать MakeMeHappyX(...), а потом когда будет новый instruction set заново переписывать абсолютно всё
Здравствуйте, Erop, Вы писали:
P>>а теперь сложите три матрицы, умножьте на четвёртую, потом на вектор. да причём так, чтобы сложение трёх матриц было эффективным, не (первая + вторая)+третья, а именно одновременно. P>>на C++ можно делать так: P>>(m1+m2+m3)*m4*v1, P>>а что будет на C? E>На С++ это будет эффективно, если повезёт, там автор класса матриц не заленится прикрутить шаблоны выражений, а потом все эти шаблонные навороты не дадут осечки, и компилятор не слажает и оптимизатор и т. д... E>А вот на С будет CUDAшное ядро и соотвтествующий вызов...
ога, CUDA/OpenCL ведь только для C доступны...
Шаблонами выражений можно генерировать OpenCL ядра под конкретные выражение, а кого на этот раз позовёт C ?
Здравствуйте, Erop, Вы писали:
AS>>И чем мешает написать функцию Сделать_Нужное_Нам_Вычисление(v1,m4,m1,m2,m3,...) без всякой магии и предельно оптимально? Например с распараллеливанием по ядрам и/или поддержкой разреженных матриц?! Или это всё про сферического коня в вакууме? E>Речь про другое. Что мы что-то автоматизируем. То есть мы типа берём какие-то матрицы, как-то их хаполняем, пишем какие-то выражения, почти, как на доске или в блокное и чего-то там получаем. E>только так не выходит, ручками всё равно выходит лучше пока что. E>А если не ручками, а нормально оптимизировать матричные вычисления надо, то это не в С++ надо, а в вольфрам-математику...
кстати, раз вы вычмат, вы пробовали Blitz++/uBlas/Eigen/etc ?
И всё равно не выходит?
Здравствуйте, Piko, Вы писали:
P>какие-именно вычматы? зубочистки на 40 строк?
Ну по линейке любые...
P>Тут вопрос в то что возможно ли вообще или нет. P>C++ на порядок по объёму кода смог обогнать Fortran, специально заточенный под вычисления. P>С тут и рядом не стоит.
FORTRAN заточен на вычисления, а не на экономию объёма кода..
Но сама по себе цель экономии объёма не понятная. Понятная экономия поддержки, разработки и т. д...
P>При чём тут указатели? Фишка в том что операции над итераторами мэпятся в одну-несколько ассемблеровских инструкций P>Вы листинг посмотрите.
При том, что если у тебя есть какие-то свои быстрые коллекции, например, то тебе не получится засунуть их в std::sort, пока не припишешь к ним итераторы...
P>не было встроенного (был "не встроенный") move синтаксиса, и что?
и то, что прога упадёт в RT без всяких предупреждений и гарантий...
P>это место конкретно косяк auto_ptr, а не vector.
Это место -- косяк шаблонов, как концепции. ОНИ НЕ МОГУТ ДАТЬ НИКАКИХ ГАРАНТИЙ...
так же как и макросы, например.
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, Piko, Вы писали:
P>ога, CUDA/OpenCL ведь только для C доступны... P>Шаблонами выражений можно генерировать OpenCL ядра под конкретные выражение,
Просим! Просим!
P>а кого на этот раз позовёт C ?
Никого, поросто руками ядро прогер напишет и всё. А для того, что бы писать скрипты с плюсиками в матрицах есть более другие средства, чем С/С++
МатКад, например
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, Piko, Вы писали:
P>кстати, раз вы вычмат, вы пробовали Blitz++/uBlas/Eigen/etc ? P>И всё равно не выходит?
Когда я ещё вычматами занимался, этого всего, как и нормального С++ не было...
А сейчас я в AI давно переквалифицировался, и тут С++ рулит, конечно, но С++ без фанатизма
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, Erop, Вы писали:
P>>Тут вопрос в то что возможно ли вообще или нет. P>>C++ на порядок по объёму кода смог обогнать Fortran, специально заточенный под вычисления. P>>С тут и рядом не стоит. E>FORTRAN заточен на вычисления, а не на экономию объёма кода.. E>Но сама по себе цель экономии объёма не понятная. Понятная экономия поддержки, разработки и т. д...
Я вам объяснял пункты про скорость и объём кода
P>>При чём тут указатели? Фишка в том что операции над итераторами мэпятся в одну-несколько ассемблеровских инструкций P>>Вы листинг посмотрите. E>При том, что если у тебя есть какие-то свои быстрые коллекции, например, то тебе не получится засунуть их в std::sort, пока не припишешь к ним итераторы...
ну и?
P>>не было встроенного (был "не встроенный") move синтаксиса, и что? E>и то, что прога упадёт в RT без всяких предупреждений и гарантий... P>>это место конкретно косяк auto_ptr, а не vector. E>Это место -- косяк шаблонов, как концепции. ОНИ НЕ МОГУТ ДАТЬ НИКАКИХ ГАРАНТИЙ... E>так же как и макросы, например.
как никаких? вернёмся к std::sort и qsort, разве std::sort не даёт больше гарантий?
и да, они не защищают абсолютно ото всех ошибок
Здравствуйте, Piko, Вы писали:
P>как никаких? вернёмся к std::sort и qsort, разве std::sort не даёт больше гарантий?
Нет, конечно. qsort, как минимум не будет копировать компаратор, потому, что у него есть только указатель на функцию...
P>и да, они не защищают абсолютно ото всех ошибок
В среднем интерфейс шаблонов гарантирован и специфицирован хуже, чем интерфейс функций. И формально проверить его соблюдение тоже сложенее
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, Erop, Вы писали:
P>>ога, CUDA/OpenCL ведь только для C доступны... P>>Шаблонами выражений можно генерировать OpenCL ядра под конкретные выражение, E>Просим! Просим!
на каждое встретившееся выражение напишет? А потом каждое перепишет на новую архитектуру?
ну так я о том и говорю, кода на порядки больше.
E>А для того, что бы писать скрипты с плюсиками в матрицах есть более другие средства, чем С/С++ E>МатКад, например
Ага, вот купил чувак допустим ansys, и solver ему говорит: "ты скопируй пожалуйста вот эти матрицы, вектора и выражения в MathCad, а мне результат скажешь".
Я это к тому, матрицы и в программах нужны, и конечный пользователь может даже не догадываться что они там есть.
offtopic: для matlab'а сейчас очень много решений на gpgpu появилось
Здравствуйте, Erop, Вы писали:
P>>как никаких? вернёмся к std::sort и qsort, разве std::sort не даёт больше гарантий? E>Нет, конечно. qsort, как минимум не будет копировать компаратор, потому, что у него есть только указатель на функцию...
если нужен шаблонный sort, именно с указателем на компаратор, никто не мешает его написать, и причём проверка типов будет лучше чем у qsort, гарантий больше
P>>и да, они не защищают абсолютно ото всех ошибок E>В среднем интерфейс шаблонов гарантирован и специфицирован хуже, чем интерфейс функций. И формально проверить его соблюдение тоже сложенее
Сейчас фактически спецификацией интерфейсов шаблонов является их код.
Но, даже в C++98 можно использовать ограниченные Constraints/ConceptsCheck .
И надеюсь в скором будущем появятся полноценные концепции.
Вот вы кстати упоминали динамические языки в соседней теме.
Во многих из них есть точно такой же duck-typing, но в C++ этот duck-typing времени компиляции, а не исполнения.
Здравствуйте, Piko, Вы писали:
P>Вот вы кстати упоминали динамические языки в соседней теме. P>Во многих из них есть точно такой же duck-typing, но в C++ этот duck-typing времени компиляции, а не исполнения.
Дык и какая разница? Всё равно баги только при тестировании вылезут...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, Erop, Вы писали:
P>>Вот вы кстати упоминали динамические языки в соседней теме. P>>Во многих из них есть точно такой же duck-typing, но в C++ этот duck-typing времени компиляции, а не исполнения. E>Дык и какая разница? Всё равно баги только при тестировании вылезут...
Здравствуйте, Piko, Вы писали:
E>>Дык и какая разница? Всё равно баги только при тестировании вылезут...
P>someDuckTypeCrap.quack();
P>шаблоны — ошибка compile-time P>динамическая типизация — run-time P>
Ага-ага.
std::vector<std::auto_ptr<quack_T> > ups;
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
И чё? Этаа штука разложит всё хорошо по ядрам, не нарушит паттерны доступа к памяти и эффективно заюзает память текстур?
что-то я не верю. Они просто собирают ядро тупо, и всё.
E>>Никого, поросто руками ядро прогер напишет и всё.
P>на каждое встретившееся выражение напишет? А потом каждое перепишет на новую архитектуру? P>ну так я о том и говорю, кода на порядки больше.
Ну при такой безумной архитектуре да. На порядки. Но обычно выделяют какие-то операции и вперёд, потом пишут на них...
P>Ага, вот купил чувак допустим ansys, и solver ему говорит: "ты скопируй пожалуйста вот эти матрицы, вектора и выражения в MathCad, а мне результат скажешь".
А зачем коду ansys выглядеть, как матрицы с плюсиками?
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, Erop, Вы писали:
E>>>Дык и какая разница? Всё равно баги только при тестировании вылезут... P>>someDuckTypeCrap.quack(); P>>шаблоны — ошибка compile-time P>>динамическая типизация — run-time P>>
E>Ага-ага. E>std::vector<std::auto_ptr<quack_T> > ups;
точно такой же баг возможен и без duck-typing — например есть интерфейс с методом copy, и есть класс который реализует этот copy как move, либо вообще как remove.
duck-typing не причём
P>>пожалуйста, только там Cuda http://graphics.tu-bs.de/media/publications/wenger2011cuda.pdf (я бы делал на OpenCL, ибо не надо таскать с собой компилятор) P>> E>И чё? Этаа штука разложит всё хорошо по ядрам, не нарушит паттерны доступа к памяти и эффективно заюзает память текстур? E>что-то я не верю. Они просто собирают ядро тупо, и всё.
эта штука proof-of-concept, у них только сложения векторов и умножение на скаляр.
При сложении векторов/умножению на скаляр, доступ к памяти наипростейший, всё прекрасно coalesced.
Насколько я помню, память текстур не нужно юзать уже года как два, так как добавили кэш (раньше он был только для текстурной памяти), но в этом примере кэш вообще не решает.
решает то, что если есть несколько десятков разных выражений — для каждого строится оптимальное ядро.
подобные принципы можно применять и для более сложных задач, например spmv, gemm, и т.п.
E>>>Никого, поросто руками ядро прогер напишет и всё. P>>на каждое встретившееся выражение напишет? А потом каждое перепишет на новую архитектуру? P>>ну так я о том и говорю, кода на порядки больше. E>Ну при такой безумной архитектуре да. На порядки. Но обычно выделяют какие-то операции и вперёд, потом пишут на них...
ну вот в случае сложения с векторами, ну выделили вы vec_add(v1,v2), и как вы теперь сделаете сложение 5 векторов?
vec_add(vec_add(vec_add(vec_add(v1,v2),v3),v4)
?
а ничего что это почти в два раза медленней чем одним ядром?
P>>Ага, вот купил чувак допустим ansys, и solver ему говорит: "ты скопируй пожалуйста вот эти матрицы, вектора и выражения в MathCad, а мне результат скажешь". E>А зачем коду ansys выглядеть, как матрицы с плюсиками?
эти матрицы с плюсиками:
1. более читабельны, ближе к языку решаемой проблемы
2. выражают семантику намерений напрямую — соответственно могут лениво вычисляться, блокироваться, и т.д, причём автоматом.
3. легче расширять на новые наборы инструкций
P>эти матрицы с плюсиками: P>1. более читабельны, ближе к языку решаемой проблемы P>2. выражают семантику намерений напрямую — соответственно могут лениво вычисляться, блокироваться, и т.д, причём автоматом. P>3. легче расширять на новые наборы инструкций
Здравствуйте, Piko, Вы писали:
P>точно такой же баг возможен и без duck-typing — например есть интерфейс с методом copy, и есть класс который реализует этот copy как move, либо вообще как remove.
Это легко формально проверяется и требуется.
P>duck-typing не причём
Наверное, а шаблоны С++ при чём...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, Piko, Вы писали:
P>>эти матрицы с плюсиками: P>>1. более читабельны, ближе к языку решаемой проблемы P>>2. выражают семантику намерений напрямую — соответственно могут лениво вычисляться, блокироваться, и т.д, причём автоматом. P>>3. легче расширять на новые наборы инструкций P>4. на порядок меньше кода чем в Fortran/C
5. к матрицам(столбцам), векторам и т.п., можно добавить единицы измерения — использование векторов/матриц с неправильными единицами измерения ловится в compile-time
Здравствуйте, Piko, Вы писали:
E>>Ага-ага. E>>std::vector<std::auto_ptr<quack_T> > ups;
P>точно такой же баг возможен и без duck-typing — например есть интерфейс с методом copy, и есть класс который реализует этот copy как move, либо вообще как remove. P>duck-typing не причём
При чём, при чём.
Вот смотри, если есть интерфейс, то мы можем формально описать его свойства, и даже формально их как-то проверить, например юнит-тестами... Или ещё как-нибудь.
В любом случае для всех объектов, которые поддерживают тот интерфейс, нам надо проверить корректность его поддержания. При этом факт поддержания всегда заявлен явно, так что понятно что где и как проверять. А в функции мы только формально опять же требуем на вход интерфейс и всё.
Во-первых, ошибка хорошо локализуется, во-вторых, хорошо делится ответственность...
А в случе шаблонов фиг чего и где потребуешь, а если и потребуешь, то это бует всё равно на втой страх и риск и только. Формально среда разработки тебе не поможет...
Понятно, что на std::vector ответственность ты не переложишь, но если это будет какой-то твой шаблон, который неожиданным для тебя образом заюзали, то будет очень трудно понять, чь это ошибка. Твоя, что не предусмотрел и такой сценарий, или того, кто этот сценарий воплотил...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
P>? P>а ничего что это почти в два раза медленней чем одним ядром?
Блин, ну что за криворукость-то? А как это запраграммировать, если шаблонов нет? Сам придумаешь?
P>1. более читабельны, ближе к языку решаемой проблемы
Это мифическое преимущество. Всякие тем add и dp не менее читабельны...
Тем более, что многие операторы ты всё равно не запишешь на С++. Ну, как, например, обратную матрицу записать?
P>2. выражают семантику намерений напрямую — соответственно могут лениво вычисляться, блокироваться, и т.д, причём автоматом.
Почему ты считаешь, что автоматом решать что там надо считать, а что нет лучше, чем если таки программист подумает и напишет оптимальный код?
P>3. легче расширять на новые наборы инструкций
Тоже неправда.
Переписывать надо будет только те функции, в которых есть ядра...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, Erop, Вы писали:
E>Здравствуйте, 11molniev, Вы писали:
1>>Позволю себе частично с вами не согласиться, все достаточно сильно зависит от решаемых задач. Бесспорно, грамотный код на С++, при реализации дублирующихся функций будет компактней, безопасней и во всех остальных отношениях (кроме, возможно сложности) лучше. Но если функциональность не дублируется или дублируется с мелкими изменениями, выходит, что приплюснутого кода получается больше, иногда ещё и с ущербом для скорости и читабельности.
E>Не понимаю, в чём тут отличие С и С++ даже, а не С и С-подобного подмножества С++ E>Мне так кажется, что у всех сторонников С в голове всё время сидят С++-темплейты. А их можно вообще не использовать, ну или использовать очень очень ограниченно, там где они реально рулят и дают огромные преимущества, например...
По факту отличий два:
1. Простой (ограниченный) синтаксис.
2. Полная предсказуемость поведения.
E>С++ намного больше, чем шаблоны и ООП. Там ещё есть строгая типизация, перегруженные функции, тип CComplex, можно написать нормальную строчку или класс данных, содержащий изображения, например, и т. д... E>Опять же RAII и исключения всякие могут рассматриваться...
Вот это как раз и есть 1 и 2 пункты выше. E>То есть есть некоторый даже не "С с классами", а "С с классами, но не с объектами". И он вроде как таки лучше С, при этом он позволяет писать всё то же, что и на С, и в общем-то так же, только проще, безопаснее, выразительнее и т. д...
Беда людей, которые отрицают С именно в непонимании отличий, что я назвал. Когда я хочу получать только то что хочу — я предпочитаю С. Если мне нужна краткая запись & RAII — я выберу С++.
Вы пытаетесь мне объяснить преимущества С++ — но я ведь пишу программы и на нём. И знаю эти преимущества. И мне нравиться ими пользоваться. Но иногда я использую чистый С — разве в этом есть что-то плохое?
E>Плохо, что мало есть средств автоматического ограничения С++ таким образом.
А зачем они вообще нужны? Зачем пытаться использовать С++ отказываясь от отдельных элементов языка?
Просто есть люди которые первым языком изучали С++ — им им тяжело отказываться от его преимуществ. Я думаю от того и идут заявления — пишите на ++, а не на С.
E>Я бы, например, как менеджер, хотел бы иметь в С++ проекте какой-то профиль, в котором было бы размечено, чего из зыка можно юзать, а чего нет. И на выход в каком-то куске кода в продакшен-сборке, требовалась бы цыфровая подпись куска каким-то начальником или экспертом...
E>Но такого рода инструментов в С++ вообще нет...
1>>Если уж совсем грубо, то плюсы можно сравнить с архиватором — сжатие (улучшение параметров) зависит от контента и результат может оказаться больше оригинала (при этом ещё и время на распаковку будет тратиться).
E>Ну так это только при бездумном использовании инструмента. Причём любого. В микроскоп прекрасно видно бактерии, но орехи им колоть неудобно, а соседское окно, так и вовсе не видно...
Просто входные данные бывают разными ))
Здравствуйте, Piko, Вы писали:
P>Здравствуйте, 11molniev, Вы писали:
P>>>>>то что цитата в вопросе вырвана из контекста, я уже писал 1>>>>Ну сделайте голосовалку не вырванную из контекста. Я чем этому мешаю? P>>>а смысл? вот буквально ниже: P>>>>>итого, мою точку зрения поддерживают 32.5% (даже при "плохой" постановке вопроса) P>>>>>и? 1>>>>Привет им. Мног8ие считают, что питон быстрей всех языков в мире. P>>>вы приравниваете людей разделяющих мою точку зрения к баранами 1>>Нет, просто я обращаю внимание, что большинство участников этого форума имеют значительный опыт и знание, и их мнение стоит слышать. И ставить выше мнения отдельных товарищей.
P>то есть 67.5% имеют значительный опыт и знание, а 32.5% это бараны?
а 32.5% имеют меньший опыт, могут заблуждатся или иначе трактовать вопрос... Мне кажется очевидным, что кто то имеет больший опыт/знания, а кто то меньший и ваше желание оскорбить людей мне совершенно не понятно.
Здравствуйте, Piko, Вы писали:
P>Здравствуйте, 11molniev, Вы писали:
P>>>>>смотрим моё утверждение в этом топике: 1>>>>Ваше утверждение это самый серьезный пруф, который я только видел. P>>> P>>>у вас в голове контекст вообще мизерный, что-ли? 1>>Так вы в той ветки так и не смогли написать код на С++, быстрей кода на С.
P>вам уже объясняли, и не только я: P>http://www.rsdn.ru/forum/cpp/4735187.1.aspx
1>>> P>Так что быстрее? std::sort (C++ style) vs qsort (C-style) ?
1>>> Они идентичны, если речь идёт о стандарте, Если не стандарт, то некоторые
1>>> реализации qsort сливают.
MZ>>Как бы ты не прав. Они НЕ идентичны. С++ный шаблоный код потенциально
MZ>>быстрее, т.к. там возможно встраивание кода функции сравнения, и
MZ>>прочие оптимизации, отсюда вытекающие. Также С++ный код знает
MZ>>ТИП массива, а С-шный -- не знает. Тоже могут быть оптимизации.
MZ>>Конечно, С-шный код в принципе тоже может это соптимизнуть,
MZ>>но только это должен быть ОЧЕНЬ умный компилятор.
P>а теперь конкретно про тот пример, сколько кода добавится в вашем случае если нужно отсортировать ещё float'ы, double'ы, несколько структур? И сколько в случае C++?
А вам в каждой программе необходимо отсортировать "ещё float'ы, double'ы, несколько структур"? Лично я за последние пару лет ни qsort, ни std::sort не пользовался. Пользовался order by в linq & sql — это да. А вот в С/С++... нет.
P>>>>>Это распространённое заблуждение, что код на C более быстр и менее требователен. Если важна эффективность, C++ легко позволяет писать более оптимальные программы чем C.
P>>>>>что вам не ясно-то? 1>>>>Мне не ясно, почему вы не думаете головой. пытаетесь противоречить фактам. P>>>каким фактам? 1>>1. Любой код на С++ представим эквивалентным кодом на С. 1>>2. Код на С++ и эквивалентный на С при компиляции дадут идентичный машинный код (если вы знаете, что это). 1>>3. Идентичный машинный код имеет идентичную скорость.
P>4. эквивалентный код на C может быть в 10/100/1000 раз больше, и зачастую не пишется
Чё так мало то? Если у вас так сильно дублируеться код могу только сочувствовать.
P>>>
P>>>Ну так там где в C возможно compile-time, оно возможно и в C++, причём в C++ — оно может достигается намного легче/лучше/красивее, а может намного тяжелее/хуже/уродливей
P>>>Вы с этим согласны/не согласны? 1>>Да, с исправленным мной согласен.
P>вы исправили мой текст, facepalm..
Ну а вы мой. В расчете?
P>"а может намного тяжелее/хуже/уродливей" P>как оно вообще может достигаться уродливей, если C по большей части является подмножеством C++ ?
Использованием не того подмножества И кстати С и С++ — это пересекающиеся множества, а не один подмножество другого.
P>>>>>вы хотели подтвердить моё высказывание своим опросом? 1>>>>Что 2/3 посетителей этого форума с вами совсем не согласны.
P>>>ну и?: P>>>
P>>>Это распространённое заблуждение, что код на C более быстр и менее требователен. Если важна эффективность, C++ легко позволяет писать более оптимальные программы чем C.
1>>Вы повторяете это как мантру только на этом форуме, каждое сообщение, или в жизне тоже? Я не хочу вас обидеть, но ИМХО: у вас нет опыта практической работы. А информацию о распространеном заблуждении вы почерпнули из книжки/лекций/форумов.
P>мне не раз отвечали на вопрос почему они не используют средства C++, тем что считают их медленными. на что, я показывал идентичный ассемблерный листинг при намного меньшем коде
Если вы знаете, что токае ассемблерный листинг, то уж должны то понимать, почему на С++ нельзя писать код более быстрый, чем на С. Равный да. Медленней да. Быстрей нет.
P>на ваше имхо, могу ответить "аналогичным" своим: вы вообще не написали строчки кода C++
Ну некоторые думаю, что бог создал Землю и она плоская. Это право каждого человека. P>и к чему это?
Кто му, что это ваше предложение подтвержадет мою мысль. А значит переливать с вами из пустого порожня толку нету.
1>>PS. Либо аргументируйте свою позицию, либо спорьте ещё с кем то. Меня аргументы, что это распространенное заблуждение совсем не впечатляют.
P>"распространённое заблуждение" — это пояснение к результатам голосования
Аргументов нет. Так что я откланяюсь. Досвидание, успехов в повышении квалификации. (без сарказма).
Здравствуйте, Erop, Вы писали:
E>>>Ага-ага. E>>>std::vector<std::auto_ptr<quack_T> > ups; P>>точно такой же баг возможен и без duck-typing — например есть интерфейс с методом copy, и есть класс который реализует этот copy как move, либо вообще как remove. P>>duck-typing не причём
E>При чём, при чём.
E>Вот смотри, если есть интерфейс, то мы можем формально описать его свойства, и даже формально их как-то проверить, например юнит-тестами... Или ещё как-нибудь. E>В любом случае для всех объектов, которые поддерживают тот интерфейс, нам надо проверить корректность его поддержания. При этом факт поддержания всегда заявлен явно, так что понятно что где и как проверять. А в функции мы только формально опять же требуем на вход интерфейс и всё.
ну вот поверьте точно также конструктор копирования
E>Во-первых, ошибка хорошо локализуется, во-вторых, хорошо делится ответственность... E>А в случе шаблонов фиг чего и где потребуешь, а если и потребуешь, то это бует всё равно на втой страх и риск и только. Формально среда разработки тебе не поможет...
что надёжней по вашему мнению, std::sort или qsort?
E>Понятно, что на std::vector ответственность ты не переложишь, но если это будет какой-то твой шаблон, который неожиданным для тебя образом заюзали, то будет очень трудно понять, чь это ошибка. Твоя, что не предусмотрел и такой сценарий, или того, кто этот сценарий воплотил...
Здравствуйте, Erop, Вы писали:
P>>ну вот в случае сложения с векторами, ну выделили вы vec_add(v1,v2), и как вы теперь сделаете сложение 5 векторов? P>>
P>>? P>>а ничего что это почти в два раза медленней чем одним ядром? E>Блин, ну что за криворукость-то? А как это запраграммировать, если шаблонов нет? Сам придумаешь?
в случае с gpgpu — можно, но:
Но обычно выделяют какие-то операции и вперёд, потом пишут на них...
это ваши слова
P>>1. более читабельны, ближе к языку решаемой проблемы E>Это мифическое преимущество. Всякие тем add и dp не менее читабельны...
менее, я сравнивал
P>>2. выражают семантику намерений напрямую — соответственно могут лениво вычисляться, блокироваться, и т.д, причём автоматом. E>Почему ты считаешь, что автоматом решать что там надо считать, а что нет лучше, чем если таки программист подумает и напишет оптимальный код?
четвёртая страница — на fortran'е получилось в 5 раз больше кода + не один день ручного тюнинга, и всё равно получилось медленней
для каждого выражения будете тратить несколько дней
P>>3. легче расширять на новые наборы инструкций E>Тоже неправда. E>Переписывать надо будет только те функции, в которых есть ядра...
ну, целые ядра, а на C++ при правильном подходе лишь небольшие части ядер (которые общие для многих ядер), так как логика не меняется
Здравствуйте, 11molniev, Вы писали:
P>>>>>>то что цитата в вопросе вырвана из контекста, я уже писал 1>>>>>Ну сделайте голосовалку не вырванную из контекста. Я чем этому мешаю? P>>>>а смысл? вот буквально ниже: P>>>>>>итого, мою точку зрения поддерживают 32.5% (даже при "плохой" постановке вопроса) P>>>>>>и? 1>>>>>Привет им. Мног8ие считают, что питон быстрей всех языков в мире. P>>>>вы приравниваете людей разделяющих мою точку зрения к баранами 1>>>Нет, просто я обращаю внимание, что большинство участников этого форума имеют значительный опыт и знание, и их мнение стоит слышать. И ставить выше мнения отдельных товарищей.
P>>то есть 67.5% имеют значительный опыт и знание, а 32.5% это бараны? 1>а 32.5% имеют меньший опыт, могут заблуждатся или иначе трактовать вопрос...
Браво!!!
"тот кто со мной не согласен, просто имеют меньший опыт, либо заблуждаются"
1>>>> P>Так что быстрее? std::sort (C++ style) vs qsort (C-style) ?
1>>>> Они идентичны, если речь идёт о стандарте, Если не стандарт, то некоторые
1>>>> реализации qsort сливают.
MZ>>>Как бы ты не прав. Они НЕ идентичны. С++ный шаблоный код потенциально
MZ>>>быстрее, т.к. там возможно встраивание кода функции сравнения, и
MZ>>>прочие оптимизации, отсюда вытекающие. Также С++ный код знает
MZ>>>ТИП массива, а С-шный -- не знает. Тоже могут быть оптимизации.
MZ>>>Конечно, С-шный код в принципе тоже может это соптимизнуть,
MZ>>>но только это должен быть ОЧЕНЬ умный компилятор.
P>>а теперь конкретно про тот пример, сколько кода добавится в вашем случае если нужно отсортировать ещё float'ы, double'ы, несколько структур? И сколько в случае C++? 1>А вам в каждой программе необходимо отсортировать "ещё float'ы, double'ы, несколько структур"?
да
1>Лично я за последние пару лет ни qsort, ни std::sort не пользовался. Пользовался order by в linq & sql — это да. А вот в С/С++... нет.
так смысл ведь не в самой сортировке(это один из примеров) а в том, что интерфейсы C++ более надёжные и быстрые одновременно, по-моему это очевидно
P>>>>>>Это распространённое заблуждение, что код на C более быстр и менее требователен. Если важна эффективность, C++ легко позволяет писать более оптимальные программы чем C.
P>>>>>>что вам не ясно-то? 1>>>>>Мне не ясно, почему вы не думаете головой. пытаетесь противоречить фактам. P>>>>каким фактам? 1>>>1. Любой код на С++ представим эквивалентным кодом на С. 1>>>2. Код на С++ и эквивалентный на С при компиляции дадут идентичный машинный код (если вы знаете, что это). 1>>>3. Идентичный машинный код имеет идентичную скорость. P>>4. эквивалентный код на C может быть в 10/100/1000 раз больше, и зачастую не пишется 1>Чё так мало то? Если у вас так сильно дублируеться код могу только сочувствовать.
у меня код не дублируется зачем переходить на личности не понятно
я выше по топику привёл пример, что на fortran'е понадобилось на порядок больше кода, для реализации меньшей функциональности, при соизмеримой скорости так это был fortran, и задача была fortran'овская, что уж говорить про C
1> И кстати С и С++ — это пересекающиеся множества, а не один подмножество другого.
и? в этой теме это не раз говорилось, и мной в том числе
P>>>>>>вы хотели подтвердить моё высказывание своим опросом? 1>>>>>Что 2/3 посетителей этого форума с вами совсем не согласны.
P>>>>ну и?: P>>>>
P>>>>Это распространённое заблуждение, что код на C более быстр и менее требователен. Если важна эффективность, C++ легко позволяет писать более оптимальные программы чем C.
1>>>Вы повторяете это как мантру только на этом форуме, каждое сообщение, или в жизне тоже? Я не хочу вас обидеть, но ИМХО: у вас нет опыта практической работы. А информацию о распространеном заблуждении вы почерпнули из книжки/лекций/форумов.
P>>мне не раз отвечали на вопрос почему они не используют средства C++, тем что считают их медленными. на что, я показывал идентичный ассемблерный листинг при намного меньшем коде 1>Если вы знаете, что токае ассемблерный листинг, то уж должны то понимать, почему на С++ нельзя писать код более быстрый, чем на С. Равный да. Медленней да. Быстрей нет.
если бы вы знали что такое aliasing,
если бы вы поняли (наконец) что аналогичный код на C может быть на несколько порядков больше, то перестилали бы повторять свою мантру.
1>>>PS. Либо аргументируйте свою позицию, либо спорьте ещё с кем то. Меня аргументы, что это распространенное заблуждение совсем не впечатляют. P>>"распространённое заблуждение" — это пояснение к результатам голосования 1>Аргументов нет. Так что я откланяюсь. Досвидание, успехов в повышении квалификации. (без сарказма).
аргументы есть, вы их в упор не видите. из всех собеседников здесь вы самый унылый, узколобый и не конструктивный
(без сарказма).
удачи
1>По факту отличий два: 1>1. Простой (ограниченный) синтаксис.
пока не началась макропись, да, относительно простой.
Но конструкции вида
int (((*)f(int[])*)(int(*)[5]))[10];
и
b += с += ++b-c++;
-- примеры хвалёного простого синтаксиса и полной предсказуемости, кстати, тоже 1>2. Полная предсказуемость поведения.
но есть подмножество с++, обладающее теми же свойствами.
1>Беда людей, которые отрицают С именно в непонимании отличий, что я назвал. Когда я хочу получать только то что хочу — я предпочитаю С. Если мне нужна краткая запись & RAII — я выберу С++.
Не мог бы ты понятно пояснить, чем хак с __AutoRelease__ { } лучше честного RAII?
E>>Ну так это только при бездумном использовании инструмента. Причём любого. В микроскоп прекрасно видно бактерии, но орехи им колоть неудобно, а соседское окно, так и вовсе не видно... 1>Просто входные данные бывают разными ))
Просто программировать надо не в состояни полного ачтоиилота, а с превлечением головы к процессу
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
P>ну вот поверьте точно также конструктор копирования
КК какого объекта?
В случае интерфейсов объект явно заявляет, что он это может, и у всех таких объектов можно проверить,что интерфейс реализован верно...
E>>Во-первых, ошибка хорошо локализуется, во-вторых, хорошо делится ответственность... E>>А в случе шаблонов фиг чего и где потребуешь, а если и потребуешь, то это бует всё равно на втой страх и риск и только. Формально среда разработки тебе не поможет...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, Erop, Вы писали:
P>>ну вот поверьте точно также конструктор копирования E>КК какого объекта?
который копируете
E>В случае интерфейсов объект явно заявляет, что он это может, и у всех таких объектов можно проверить,что интерфейс реализован верно...
в случае с KK, объект явно заявляет что у него есть KK, и у всех таких объектов можно проверить этот КК
Здравствуйте, Piko, Вы писали:
P>который копируете
Ну и как формально получить список всех объектов у которых надо проверить это свойство?
Когда я в коде просто требую поддержки интерфейса, а там, где этот интерфейс поддержал, я и проверяю, что поддержал его удачно, то такая схема хорошо работает. А с шаблонами не понятно как всё это устроить.
не понятно как полчуить исчерпывающий список шаблонов, которые это свойство требует, и как получить исчерпывающий список типов, от которых это свойство требуют...
P>в случае с KK, объект явно заявляет что у него есть KK, и у всех таких объектов можно проверить этот КК
Я очень боюсь тебя расстроить, но в С++ КК есть вообще У ВСЕХ структур и классов. Просто у некоторых из них он таков, что программа сожержащая реальный вызов такого КК illformed...
Но, тем не менее, формально он есть у всех объектов...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, Erop, Вы писали:
P>>который копируете E>Ну и как формально получить список всех объектов у которых надо проверить это свойство? E>Когда я в коде просто требую поддержки интерфейса, а там, где этот интерфейс поддержал, я и проверяю, что поддержал его удачно, то такая схема хорошо работает. А с шаблонами не понятно как всё это устроить. E>не понятно как полчуить исчерпывающий список шаблонов, которые это свойство требует,
все шаблонны, которые копируют объекты
E>и как получить исчерпывающий список типов, от которых это свойство требуют...
все те типы, которые хоть где-то копируют
научить?
P>>в случае с KK, объект явно заявляет что у него есть KK, и у всех таких объектов можно проверить этот КК E>Я очень боюсь тебя расстроить, но в С++ КК есть вообще У ВСЕХ структур и классов. Просто у некоторых из них он таков, что программа сожержащая реальный вызов такого КК illformed... E>Но, тем не менее, формально он есть у всех объектов...
опять лезешь в бутылку.
проверяем все типы, которые not illformed на копирование
Здравствуйте, Piko, Вы писали:
E>>и как получить исчерпывающий список типов, от которых это свойство требуют...
P>все те типы, которые хоть где-то копируют
P>научить?
Ну научи, только оно не должно ругаться на валидные случаи использования std::auto_ptr
P>проверяем все типы, которые not illformed на копирование
И получаем, что std::auto_ptr не валиден. Грустно плачем и несём С++/STL на помоечку?
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, Erop, Вы писали:
E>>>и как получить исчерпывающий список типов, от которых это свойство требуют... P>>все те типы, которые хоть где-то копируют P>>научить? E>Ну научи, только оно не должно ругаться на валидные случаи использования std::auto_ptr
например таким подходом:
Finder.addMatcher(
ConstructorCall(
HasDeclaration(Method(HasName(StringConstructor))),
ArgumentCountIs(2),
// The first argument must have the form x.c_str() or p->c_str()
// where the method is string::c_str(). We can use the copy
// constructor of string instead (or the compiler might share
// the string object).
HasArgument(
0,
Id("call", Call(
Callee(Id("member", MemberExpression())),
Callee(Method(HasName(StringCStrMethod))),
On(Id("arg", Expression()))))),
// The second argument is the alloc object which must not be
// present explicitly.
HasArgument(
1,
DefaultArgument())),
&Callback);
Здравствуйте, Piko, Вы писали:
P>например таким подходом:
P>
P>Finder.addMatcher(
P> ConstructorCall(
P> HasDeclaration(Method(HasName(StringConstructor))),
P> ArgumentCountIs(2),
P> // The first argument must have the form x.c_str() or p->c_str()
P> // where the method is string::c_str(). We can use the copy
P> // constructor of string instead (or the compiler might share
P> // the string object).
P> HasArgument(
P> 0,
P> Id("call", Call(
P> Callee(Id("member", MemberExpression())),
P> Callee(Method(HasName(StringCStrMethod))),
P> On(Id("arg", Expression()))))),
P> // The second argument is the alloc object which must not be
P> // present explicitly.
P> HasArgument(
P> 1,
P> DefaultArgument())),
P> &Callback);
P>
Вот у меня есть программа. На С++, доступны исходники. Что я делаю, что бы проверить?
P>нет, хотя бы потому, что std::auto_ptr это не STL
1) Standard Template Library описана во второй половине стандарта С++, и std::auto_ptr вроде как там был...
2) Суть вопроса-то была в другом. У меня может быть МОЙ класс, со свойствами, как у auto_ptr, мало того, у меня может быть МОЙ контейнер, который корректно работает с auto_ptr...
Как твои формальный проверки шаблонов это всё прожуют?
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, Erop, Вы писали:
P>>например таким подходом: E>Ничего не понял... E>Вот у меня есть программа. На С++, доступны исходники. Что я делаю, что бы проверить?
запускаете эту тулзу такого рода — она всё ищет. если нужно ещё и исправит.
P>>нет, хотя бы потому, что std::auto_ptr это не STL E>1) Standard Template Library описана во второй половине стандарта С++, и std::auto_ptr вроде как там был...
В STL — нет auto_ptr. http://en.wikipedia.org/wiki/Standard_Template_Library
я наверное сейчас ещё больше шокирую, но в STL ещё и строк нет, и об этом даже сам Степанов говорил, лично.
E>2) Суть вопроса-то была в другом. У меня может быть МОЙ класс, со свойствами, как у auto_ptr, мало того, у меня может быть МОЙ контейнер, который корректно работает с auto_ptr... E>Как твои формальный проверки шаблонов это всё прожуют?
сначала нужно определится дефектен auto_ptr с точки зрения проекта, или нет.
это точно также как определится, легально ли объекту с интерфейсом Copybale форматировать жёсткий диск или нет.
Здравствуйте, Piko, Вы писали:
P>запускаете эту тулзу такого рода — она всё ищет. если нужно ещё и исправит.
Так как она "исправит" std::auto_ptr?..
И где гарантии, что она не налажает, кстати?
P>>>нет, хотя бы потому, что std::auto_ptr это не STL E>>1) Standard Template Library описана во второй половине стандарта С++, и std::auto_ptr вроде как там был...
P>В STL — нет auto_ptr. http://en.wikipedia.org/wiki/Standard_Template_Library P>я наверное сейчас ещё больше шокирую, но в STL ещё и строк нет, и об этом даже сам Степанов говорил, лично.
Что говорил там Степанов, или что в вики кто пишет -- это всё интересно в смысле биографии этих персон. Но у С++ есть стандарт, как бы...
E>>2) Суть вопроса-то была в другом. У меня может быть МОЙ класс, со свойствами, как у auto_ptr, мало того, у меня может быть МОЙ контейнер, который корректно работает с auto_ptr... E>>Как твои формальный проверки шаблонов это всё прожуют?
P>сначала нужно определится дефектен auto_ptr с точки зрения проекта, или нет.
Нет, не дефектен. У него есть вполне логичная и понятная парадигма использования. Положим, что в проекте её придерживаются...
P>это точно также как определится, легально ли объекту с интерфейсом Copybale форматировать жёсткий диск или нет.
Очеивдно, что не валидно, в смысле через интерфейс копирования, не валидно, а через какой-то иной, может и валидно....
ОБЧНО ИНТЕРФЕЙС СПЕЦИФИЦИРУЕТ ПОВЕДЕНИЕ!!!
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, Erop, Вы писали:
P>>запускаете эту тулзу такого рода — она всё ищет. если нужно ещё и исправит. E>Так как она "исправит" std::auto_ptr?..
"если нужно" это вообще, а не конкретно про auto_ptr.
но если нужно например заменить auto_ptr на unique_ptr — она справится без проблем.
E>И где гарантии, что она не налажает, кстати?
в каком именно месте слажает? при поиске или исправлении?
какие у тебя гарантии что тест интерфейсов не слажает?
P>>>>нет, хотя бы потому, что std::auto_ptr это не STL E>>>1) Standard Template Library описана во второй половине стандарта С++, и std::auto_ptr вроде как там был... P>>В STL — нет auto_ptr. http://en.wikipedia.org/wiki/Standard_Template_Library P>>я наверное сейчас ещё больше шокирую, но в STL ещё и строк нет, и об этом даже сам Степанов говорил, лично. E>Что говорил там Степанов, или что в вики кто пишет -- это всё интересно в смысле биографии этих персон. Но у С++ есть стандарт, как бы...
ну а где в стандарте написано что autp_ptr относится к STL ???
P>>это точно также как определится, легально ли объекту с интерфейсом Copybale форматировать жёсткий диск или нет. E>Очеивдно, что не валидно, в смысле через интерфейс копирования, не валидно, а через какой-то иной, может и валидно.... E>ОБЧНО ИНТЕРФЕЙС СПЕЦИФИЦИРУЕТ ПОВЕДЕНИЕ!!!
ну и? у auto_ptr интерфейс тоже специфицирует поведение
template<class Y>
auto_ptr (auto_ptr<Y>& a) throw();
const тут нет
нужен похожий класс, но без модифицирующего копирования используйте unique_ptr или scoped_ptr
Здравствуйте, Piko, Вы писали:
P>Здравствуйте, Erop, Вы писали:
P>>>запускаете эту тулзу такого рода — она всё ищет. если нужно ещё и исправит. E>>Так как она "исправит" std::auto_ptr?..
P>"если нужно" это вообще, а не конкретно про auto_ptr. P>но если нужно например заменить auto_ptr на unique_ptr — она справится без проблем.
на что исправит?
P>в каком именно месте слажает? при поиске или исправлении?
При поиске в обоих смыслах и при исправлении?
P>какие у тебя гарантии что тест интерфейсов не слажает?
Ну найти всех наследников чего-то -- относительно простая задача, в отличии от полного парсинга С++ всех версий...
Кроме того, я ещё раз повторюсь, что интерфейс поддерживают ЯВНО, тогда же программист может регистрировать класс, поддерживающий интерфейс, в юнит-тестилке...
P>ну а где в стандарте написано что autp_ptr относится к STL ???
К стандартной библиотеке шаблонов? Ну во второй части. Точный раздел на память не помню...
Я тут подозреваю, что ты считаешь, что STL -- это только некоторое наследие кода Степанова. Это вроде бы довольно произвольно определимое множество. Ну да фиг бы с ним.
P>ну и? у auto_ptr интерфейс тоже специфицирует поведение P>
P>template<class Y>
P> auto_ptr (auto_ptr<Y>& a) throw();
P>
P>const тут нет
P>нужен похожий класс, но без модифицирующего копирования используйте unique_ptr или scoped_ptr
Не понятно, как формально потребовать от класса именно вот копируемости, а не чего-то ещё.
И это ещё простой расклад. А свойств у параметра шаблона может быть туча...
Например, скоуп, в которой определён параметр, операторы и внешние функции с ним, и т. д...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, Erop, Вы писали:
P>>>>запускаете эту тулзу такого рода — она всё ищет. если нужно ещё и исправит. E>>>Так как она "исправит" std::auto_ptr?.. P>>"если нужно" это вообще, а не конкретно про auto_ptr. P>>но если нужно например заменить auto_ptr на unique_ptr — она справится без проблем. E>
что конкретно нужно исправить?
заменить все копирования auto_ptr на move unique_ptr ?
P>>в каком именно месте слажает? при поиске или исправлении? E>При поиске в обоих смыслах и при исправлении?
а почему она должна слажать — то же самое AST используется при компиляции
P>>какие у тебя гарантии что тест интерфейсов не слажает? E>Ну найти всех наследников чего-то -- относительно простая задача, в отличии от полного парсинга С++ всех версий...
не спорю
E>Кроме того, я ещё раз повторюсь, что интерфейс поддерживают ЯВНО, тогда же программист может регистрировать класс, поддерживающий интерфейс, в юнит-тестилке...
а тулза такого рода, может сама регистрировать классы которые можно копировать
P>>ну а где в стандарте написано что autp_ptr относится к STL ??? E>К стандартной библиотеке шаблонов? Ну во второй части. Точный раздел на память не помню... E>Я тут подозреваю, что ты считаешь, что STL -- это только некоторое наследие кода Степанова. Это вроде бы довольно произвольно определимое множество. Ну да фиг бы с ним.
есть STL. А есть C++ Standard Library
E>Не понятно, как формально потребовать от класса именно вот копируемости, а не чего-то ещё.
P>ну и? у auto_ptr интерфейс тоже специфицирует поведение P>
P>template<class Y>
P> auto_ptr (auto_ptr<Y>& a) throw();
P>
P>const тут нет
Не хочу тебя расстраивать в очередной раз, но это не КК, так как КК в С++ не может быть шаблонным методом...
P>нужен похожий класс, но без модифицирующего копирования используйте unique_ptr или scoped_ptr
Нет, задача совсем другая, нам нужно
1) При разработке std::vector как-то заметить, что std::auto_ptr нам не подходит.
2) Как-то потребовать в std::vector копируемости, а не так, как у std::auto_ptr...
и то и то шаблоны, как минимум "не помогают" сделать. В этом их беда.
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, Piko, Вы писали:
P>что конкретно нужно исправить? P>заменить все копирования auto_ptr на move unique_ptr ?
Тут конкретно, ничего менять не надо. Это валидный код.
Но если у меня есть шаблон karusel<T>, который таки ждёт от T нормальной копируемости, но программист этого явно не выразил, так как не знал как выразить и не имел никакого инструмента заметить, чо ему это свойство надо, так вот, надо выявит, что karusel<auto_ptr<ZZZ>> -- ошибка...
P>есть STL. А есть C++ Standard Library
Это какая-то лингвистическая магия. Типа "Стандартная Библиотека Шаблонов" или "Стандартный библиотечный шаблон"...
P>потребовать или проверить?
Ну вот я написал шаблон какой-то.
Теперь мне хорошо бы как-то получить список свойств, которые я от своего аргумента требую + как-то проверить все используемые аргументы, на наличие этих свойств.
Ещё бы не кисло было бы заявить требования этих свойств явно, что бы программист сразу же и не пытался бы...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, Erop, Вы писали:
P>>ну и? у auto_ptr интерфейс тоже специфицирует поведение P>>
P>>template<class Y>
P>> auto_ptr (auto_ptr<Y>& a) throw();
P>>
P>>const тут нет E>Не хочу тебя расстраивать в очередной раз, но это не КК, так как КК в С++ не может быть шаблонным методом...
знаю я, не то скопировал:
auto_ptr (auto_ptr& a) throw();
P>>нужен похожий класс, но без модифицирующего копирования используйте unique_ptr или scoped_ptr E>Нет, задача совсем другая, нам нужно E>1) При разработке std::vector как-то заметить, что std::auto_ptr нам не подходит. E>2) Как-то потребовать в std::vector копируемости, а не так, как у std::auto_ptr...
очень просто: сделать функцию/метод которая принимает const auto_ptr& и внутри пытается скопировать. runtime overhead = 0
или опять не то?
E>и то и то шаблоны, как минимум "не помогают" сделать. В этом их беда.
помогают.
когда будут концепции — будет ещё лучше..
Здравствуйте, Piko, Вы писали:
P>>>нужен похожий класс, но без модифицирующего копирования используйте unique_ptr или scoped_ptr E>>Нет, задача совсем другая, нам нужно E>>1) При разработке std::vector как-то заметить, что std::auto_ptr нам не подходит. E>>2) Как-то потребовать в std::vector копируемости, а не так, как у std::auto_ptr...
P>очень просто: сделать функцию/метод которая принимает const auto_ptr& и внутри пытается скопировать. runtime overhead = 0 P>или опять не то?
1) Если эта функция не используется, то С++ её не обязан компилировать.
2) Это всё очень неявно и непонятно.
3) Ну и "При разработке std::vector как-то заметить, что std::auto_ptr нам не подходит" никак не поддержано тоже...
P>когда будут концепции — будет ещё лучше..
Да не будет лучше. Будет больше иллюзий
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, Erop, Вы писали:
P>>>>нужен похожий класс, но без модифицирующего копирования используйте unique_ptr или scoped_ptr E>>>Нет, задача совсем другая, нам нужно E>>>1) При разработке std::vector как-то заметить, что std::auto_ptr нам не подходит. E>>>2) Как-то потребовать в std::vector копируемости, а не так, как у std::auto_ptr...
P>>очень просто: сделать функцию/метод которая принимает const auto_ptr& и внутри пытается скопировать. runtime overhead = 0 P>>или опять не то?
E>1) Если эта функция не используется, то С++ её не обязан компилировать.
как раз таки явно
E>3) Ну и "При разработке std::vector как-то заметить, что std::auto_ptr нам не подходит" никак не поддержано тоже... P>>когда будут концепции — будет ещё лучше.. E>Да не будет лучше. Будет больше иллюзий
ну хз.. точно также можно сказать про интерфейсы — одни илюзии
Здравствуйте, Alexéy Sudachén, Вы писали:
ЗP>>>>>>нет, хотя бы потому, что std::auto_ptr это не STL P>>>>В STL — нет auto_ptr. http://en.wikipedia.org/wiki/Standard_Template_Library E>>>Что говорил там Степанов, или что в вики кто пишет -- это всё интересно в смысле биографии этих персон. Но у С++ есть стандарт, как бы... AS>ИМХО, что там Cтепанов говорил, сугубо ортогонально всем тем кто пишет на реальном C++, а не на словах Степанова. В референс реализации HP/SGI, которую все в том или ином виде передрали — auto_ptr есть.
Именно в STL ? http://www.sgi.com/tech/stl/table_of_contents.html
P>>ну а где в стандарте написано что autp_ptr относится к STL ???
AS>В стандарте ISO/IEC 14882 в разделе 20.4.5 Class template auto_ptr. STL же в стандарте вообще нигде не упоминается. Собственно STL к С++ имеет ровно то же отношение что и MFC.
и какой из этого вывод?? то что auto_ptr есть в STL ?
AS>Однако для простоты STL ака Standard Template Library приравнивается к стандартной библиотеке C++. Что как бы очевидно.
Здравствуйте, Alexéy Sudachén, Вы писали:
AS>>>Ну, то есть ты мне хочешь доказать, что в коде, который я перерыл вдоль и поперёк, чего-то нет? И нет именно потому как это не перечислено на какой-то страничке? Будь мужчиной, открой сырки да посмотри. Смотреть надо в файл memory http://www.sgi.com/tech/stl/memory. P>>и строки там есть http://www.sgi.com/tech/stl/string . P>>но главный автор STL — Степанов говорит что в STL нет строк — кому верить? AS>Верить сыркам — они истина.
memory — появился прям аккурат перед стандартом, и я могу предположить что это была уже реализация по-драфту.
и HP там нету
AS>Да и кому какое дело до того что говорит Степанов?
ну если он говорит "я такого дерьмища никогда в жизни не писал, и этого дерьмища нет в STL" — я ему верю, так как он главный автор STL
Здравствуйте, Piko, Вы писали:
P>и строки там есть http://www.sgi.com/tech/stl/string . P>но главный автор STL — Степанов говорит что в STL нет строк — кому верить?
Ну я предпочитаю верить своим глазам...
Но ты можешь верить Степанову больше, чем себе, почему бы и нет...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, Piko, Вы писали:
P>ну если он говорит "я такого дерьмища никогда в жизни не писал, и этого дерьмища нет в STL" — я ему верю, так как он главный автор STL
Интересно, а чувакам, которые в скде говорят, что они не убивали, ты тоже веришь?
Степанов тут лицо заинтересованное. И если его STL и был интересен, как некая математическая конструкция, но на пути его практического применения стояли и стоят некоторые препятствия, из-за которых понадобился буст, например. Так что если Степанов выбрал такю линию защиты своего детеща, что он де не писал необходимые части, а это последователи всю идею обгадили, то у меня лично возникает логичный вопрос -- а хрен ли не писал?
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, Erop, Вы писали:
E>Здравствуйте, Piko, Вы писали:
P>>и какой из этого вывод?? то что auto_ptr есть в STL ? E>Вывод просто. Есть ли auto_ptr в STL зависит от того, как в этой аббривиатуре расшифровывается первая буква. E>Если, как "степанов", то есть, но наличие не афишируется, а если как "стандартная", то есть и наличие гарантируется стандартом...
Standard Template Library
заметь, это не Standard С++ library
Здравствуйте, Erop, Вы писали:
P>>и строки там есть http://www.sgi.com/tech/stl/string . P>>но главный автор STL — Степанов говорит что в STL нет строк — кому верить? E>Ну я предпочитаю верить своим глазам... E>Но ты можешь верить Степанову больше, чем себе, почему бы и нет...
ты просто не понимаешь разницу между STL и C++ Standard Library
Здравствуйте, Erop, Вы писали:
P>>ну если он говорит "я такого дерьмища никогда в жизни не писал, и этого дерьмища нет в STL" — я ему верю, так как он главный автор STL E>Интересно, а чувакам, которые в скде говорят, что они не убивали, ты тоже веришь?
я не знаю что такое скде
и как бы в программистской среде, на таком уровне как Степанов — врать относительно того что делал, а что нет — не прилично, ибо всё проверяется
E>Степанов тут лицо заинтересованное. И если его STL и был интересен, как некая математическая конструкция, но на пути его практического применения стояли и стоят некоторые препятствия, из-за которых понадобился буст, например.
We emphasize libraries that work well with the C++ Standard Library. Boost libraries are intended to be widely useful, and usable across a broad spectrum of applications
причина создание буста — не косяки в STL
E>Так что если Степанов выбрал такю линию защиты своего детеща, что он де не писал необходимые части, а это последователи всю идею обгадили, то у меня лично возникает логичный вопрос -- E>а хрен ли не писал?
Здравствуйте, Piko, Вы писали:
P>ты просто не понимаешь разницу между STL и C++ Standard Library
Пусть так. Мне пофиг. Я считаю, что STL -- это та самая HPшная версия, но спор ни о чём.
Считай, что то моё сообщение надо было читать "...а C++ Standard Library на помоечку?"
К сути обсуждения это всё отношения не имеет...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, CreatorCray, Вы писали:
P>>Это распространённое заблуждение, что код на C более быстр и менее требователен. Если важна эффективность, C++ легко позволяет писать более оптимальные программы чем C. CC>Слушай, чего ты разоряешься? Хотят писать на С — хай пишут. Это их геморрой.
Если честно, хотелось услышать аргументы против. В ответ услышал старые перепетые мифы, и ни одного аргумента
Здравствуйте, Erop, Вы писали:
P>>ты просто не понимаешь разницу между STL и C++ Standard Library E>Пусть так. Мне пофиг. Я считаю, что STL -- это та самая HPшная версия,
E>но спор ни о чём.
Действительно:
И получаем, что std::auto_ptr не валиден. Грустно плачем и несём С++/STL на помоечку?
о чём спорить? если косяк в auto_ptr — для тебя это повод нести C++/stdlib на помоечку
E>Считай, что то моё сообщение надо было читать "...а C++ Standard Library на помоечку?" E>К сути обсуждения это всё отношения не имеет...
Здравствуйте, Piko, Вы писали:
E>>Интересно, а чувакам, которые в скде говорят, что они не убивали, ты тоже веришь?
P>я не знаю что такое скде
Очевидно, что это "суде" При наборе на сенсорном экране соседние буквы путаются на раз
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, CreatorCray, Вы писали:
CC>Представьте что вы такой крутой С программер, ну скажем, один такой крутой на целый на город. Суровая рукопашка на макросах для имитации автоматики, goto out; goto cleanup; goto error; и т.п.
Суть тут в том, что крутой С-программер рукопашкой на макросах страдает только если ОЧЕНЬ надо, а goto cleanup -- стандартный приём в С, примерно такой же стандартный, как RAII в С++
CC>Круто да? И вдруг вам нужно часть своей работы делегировать кому-то ещё... упс, да?
Ну, если проект нормально написан, то делигируешь без проблем. Впрочем как и на С++, только если он тоже НОРМАЛЬНО написан, а не как локи с STL...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, CreatorCray, Вы писали:
AS>>вместо решения задачи, будет решаться задача как это правильно сделать на С++. CC>Ты путаешь тёплое с мягким. Это верно в обратную сторону — это на С приходится изгаляться чтоб сделать то, что есть в С++.
Тут вы оба не правы, IMHO. КМК это вообще свойство программиста, а не языка -- изгаляться над формой, вместо того, что бы пилить суть
У большинства это от недостатка опыта, и постепенно проходит, но у некоторых не проходит никогда...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
CC>Слушай, чего ты разоряешься? Хотят писать на С — хай пишут. Это их геморрой.
Просто ему статья Страуст. слегка помыла мозг примером qsort vs std::sort. Он даже не верит, что может быть ситуация, когда qsort гибче и когда qsort быстрее
Но я думаю его постепенно отпустит
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, CreatorCray, Вы писали:
AS>>Я сюда не для просвещения страждущих хожу, мне сие с некоторого момента сугубо фиолетово, но троллинга и флуда ради. Короче, поразвлекаться. CC>Ради троллинга вали к троллям в КСВ.
В полоске над сообщением есть иконка такая с бомбочкой ) кликаешь и выбираешь — послать в КСВ. И усё.
CC>>Слушай, чего ты разоряешься? Хотят писать на С — хай пишут. Это их геморрой. P>Если честно, хотелось услышать аргументы против. В ответ услышал старые перепетые мифы, и ни одного аргумента
Аргументы против чего? Самый главный тормоз программы — прокладка между стулом и клавиатурой, это как бы известный факт. Как и то, что С ровно так же лучше чем С++, как и наоборот. Чем лучше? Дык чем С++. )
E>> Он даже не верит, что может быть ситуация, когда qsort гибче и когда qsort быстрее CC>Дык я тоже не верю, мне доказательства нужны.
std::sort штука интересная. Магическая можно сказать.
От только что делать с сортировкой тривиальных объектов, для которых не реализован swap, но по всем правилам реализован конструктор копирования? Что делать с компаратором, сложность которого выше чем сложность копирования? Как-то так сложилось, что qsort не приводит к распуханию кода и выноса его за кэш. В С вот нет конструктора копирования и требований на exception-safe код, что бывает сильно раляет в сравнении. Если сортировать не целые числа ... то std::sort далеко не всегда так крут как хотелось бы некоторым.
Кстати С++, на минуточку, далеко не всегда инлайнит то что хотелось бы программеру. Что бывает несколько неприятно. Как-то помнится в одном жутко шаблоном коде NO_INLINE встречался существенно чаще чем inline ))) Иначе тормозил этот код просто ужасно.
Здравствуйте, Erop, Вы писали:
P>>Действительно: P>>
P>>И получаем, что std::auto_ptr не валиден. Грустно плачем и несём С++/STL на помоечку?
P>>о чём спорить? если косяк в auto_ptr — для тебя это повод нести C++/stdlib на помоечку E>Ты тут рассказывал, как надёжно всё можно в С++ выявить и проверить. E>Я показал тебе, что твой тест не пройдёт уже стандартная библиотека С++, так что что-то надо на омоечку, либо тест, либо С++ и его стандартную библиотеку E>Предложение нести на помоечку не тест, а язык было сарказмом
дык — можно проверить, точно также как и в случае с интерфейсами
ну вот смотри, есть у тебя какая-нибудь чисто OO либа, допустим на Java. Ну вот есть в ней недостаток/недоработка, не покрытый тестами..
И что ты говоришь?? выкидывать всё из-за этого нахрен? нахрен всё OO ?
Здравствуйте, Erop, Вы писали:
E>>>Интересно, а чувакам, которые в скде говорят, что они не убивали, ты тоже веришь? P>>я не знаю что такое скде E>Очевидно, что это "суде" При наборе на сенсорном экране соседние буквы путаются на раз
мне было не очевидно, уж очень на некую аббревиатуру похоже
Здравствуйте, Erop, Вы писали:
CC>>Слушай, чего ты разоряешься? Хотят писать на С — хай пишут. Это их геморрой. E>Просто ему статья Страуст. слегка помыла мозг примером qsort vs std::sort.
пример показательный в плане того как строятся реюзабельные блоки в одном и в другом языке.
и в каком из этих языков "реюзабельность" платная
я приводил и другие примеры, в которых точно такие же проблемы. http://developer.gnome.org/glib/2.32/glib-Balanced-Binary-Trees.html
вот, тот же void*, те же проблемы — это стандартный способ решения этой задачи на C
E>Он даже не верит, что может быть ситуация, когда qsort гибче и когда qsort быстрее
не верю. ты можешь как-то обосновать/доказать свой трёп?
E>Но я думаю его постепенно отпустит
Здравствуйте, Alexéy Sudachén, Вы писали:
CC>>>Слушай, чего ты разоряешься? Хотят писать на С — хай пишут. Это их геморрой. P>>Если честно, хотелось услышать аргументы против. В ответ услышал старые перепетые мифы, и ни одного аргумента
AS>Аргументы против чего?
Потому что очень много низкокачественных C++ программистов (перешедших с C), которые
верят в то, что C быстрее чем C++,
верят в void* и т.п.,
думают что C++ это раздутые OO-иерархии,
могли обжечься 20 лет назад об C++ и этот опыт имеет их до сих пор.
В результате, когда этот сброд слышит embedded, fast, system, kernel — они бездумно используют C.
На сегодняшний день я вижу только следующие места когда можно обоснованно использовать C, а не C++ :
1) Отсутствие компилятора C++
2) В API (причём это не сам C, а только C-style interfaces)
3) В распоряжении есть только программисты знающие C, но не C++
4) Необходимость ковыряться в уже написанном на C проекте
AS>Самый главный тормоз программы — прокладка между стулом и клавиатурой, это как бы известный факт.
не спорю
AS>Как и то, что С ровно так же лучше чем С++, как и наоборот. Чем лучше? Дык чем С++. )
я уже не раз писал: надежностью, скоростью, безопасностью и т.п.
Здравствуйте, Alexéy Sudachén, Вы писали:
E>>> Он даже не верит, что может быть ситуация, когда qsort гибче и когда qsort быстрее CC>>Дык я тоже не верю, мне доказательства нужны. AS>std::sort штука интересная. Магическая можно сказать. AS>От только что делать с сортировкой тривиальных объектов, для которых не реализован swap, но по всем правилам реализован конструктор копирования?
qsort тут вообще ничего не предлагает, только свапает бит за битом
в то же время, как ты правильно заметил std::sort может использовать оптимизированный swap
AS>Что делать с компаратором, сложность которого выше чем сложность копирования?
а что с ним делать на qsort?
AS>Как-то так сложилось, что qsort не приводит к распуханию кода и выноса его за кэш.
если это действительно проблема — то всё прекрасно решается в рамках C++ — почитай performance TR, и всё равно будет надёжный интерфейс, принимающий правильные компараторы и т.п.
AS>В С вот нет конструктора копирования и требований на exception-safe код, что бывает сильно раляет в сравнении. Если сортировать не целые числа ... то std::sort далеко не всегда так крут как хотелось бы некоторым.
ээ... std::sort это лишь пример, что имхо очевидно. и дело тут вовсе не в алгоритме сортировки.
AS>Кстати С++, на минуточку, далеко не всегда инлайнит то что хотелось бы программеру. Что бывает несколько неприятно. Как-то помнится в одном жутко шаблоном коде NO_INLINE встречался существенно чаще чем inline ))) Иначе тормозил этот код просто ужасно.
для этого используются compiler-specific options, типа force inline — один раз пишется макрос на каждый компилятор и всё
Здравствуйте, Alexéy Sudachén, Вы писали:
P>>я приводил и другие примеры, в которых точно такие же проблемы. P>>http://developer.gnome.org/glib/2.32/glib-Balanced-Binary-Trees.html P>>вот, тот же void*, те же проблемы — это стандартный способ решения этой задачи на C AS>У меня только один вопрос, откуда такой мистический страх перед void* и макросами?
страха нет.
это тупо не type-safe, разве не очевидно? (есть и другие, но менее важные причины)
Здравствуйте, Alexey Sudachen, Вы писали:
AS>Я сюда прихожу 'палочкой потыкать'.
Ещё раз, ходи тыкать палочкой в специально отведённое место.
AS>Тем не менее, вы упускаете один маленький, но важный момент. С — язык активно используемый в вузах. В любом известном мне вузе, где готовят программеров, С читается как ключевой элемент программы и на нём выполняется довольно много заданий. С++ — как спецкурс
Тем хуже для этих вузов.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
P>Потому что очень много низкокачественных C++ программистов (перешедших с C), которые
P>верят в то, что C быстрее чем C++,
P>верят в void* и т.п.,
P>думают что C++ это раздутые OO-иерархии,
P>могли обжечься 20 лет назад об C++ и этот опыт имеет их до сих пор.
P>В результате, когда этот сброд слышит embedded, fast, system, kernel — они бездумно используют C.
Иначе говоря на С программирует сброд? ))) Такие аргументы это из серии — вы давно перестали бить свою жену?
при сравнении скорости C/C++ быстрее будет программист )))
в void* не надо верить его надо использовать или не использовать, ровно так же как RAII или статически полиморфизм. В С это ровно такая же идиома.
С++ таки способствует раздутым OO иерархиям, фатальый баг реализации обьектности. Аллан Кей как-то сказал что когда создавал концепцию ООП, не имел в виду С++.
Таки C++ лет назад и C++ сейчас — разные языки. Более того если сейчас писать код на C++ как двацать лет назад — сразу получишь обвинение в говнокодерстве. ))))
P>
P>На сегодняшний день я вижу только следующие места когда можно обоснованно использовать C, а не C++ :
P>1) Отсутствие компилятора C++
P>2) В API (причём это не сам C, а только C-style interfaces)
P>3) В распоряжении есть только программисты знающие C, но не C++
P>4) Необходимость ковыряться в уже написанном на C проекте
P>[/q]
AS>>Как и то, что С ровно так же лучше чем С++, как и наоборот. Чем лучше? Дык чем С++. ) P>я уже не раз писал: надежностью, скоростью, безопасностью и т.п.
Есть такая штука, называется статически неустойчивая аэродинамика. Все современные истребители нуждающиеся в предельной манёвренности строятся по такой схеме. Дык вот С — это такой истребитель, С++ же в сравнении С, — пасажирский авиалайнер. С имеет предельную манёвренность, C++ — предельную статическую устойчивость. От только проблема — авиалайнер-то он конечно авиалайнер, но передаланный с истребителя ))) что иногда бывает шокирует не только пилота, но и пассажиров. Фактически пилот шоб рулить такой хреновиной должен уметь летать ваще на всём.
Здравствуйте, CreatorCray, Вы писали:
E>>Тут вы оба не правы, IMHO. КМК это вообще свойство программиста, а не языка -- изгаляться над формой, вместо того, что бы пилить суть CC>Скажи, на чём придётся больше внимания уделять "сервисной обвязке": на языке, в котором есть автоматизация рутинных действий и на языке, в котором её нет?
В нормальных программах это всё составляет не очень большую часть трудозатрат, так что пофиг на самом деле.
Непринципиально отличается. Но для того, что бы программы стали "нормально написанными" нужен опыт, но некоторым и опыт не помогает. Будешь спорить?
E>>У большинства это от недостатка опыта, и постепенно проходит, но у некоторых не проходит никогда... CC>Оставь этот менторский тон. Он не действует как ты рассчитываешь.
Я думаю, что он злит коллег, которые обсуждают персоны, а не идеи...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, CreatorCray, Вы писали:
CC>А вот защищаемый тобой товарищ этого понимать не желает.
Это твоя главная ошибка в дискуссии. Я никого не защищаю. Я просто считаю, что преимущества того самого подмножества С неожиданно не так уж и велики...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
AS>>От только что делать с сортировкой тривиальных объектов, для которых не реализован swap, но по всем правилам реализован конструктор копирования? P>qsort тут вообще ничего не предлагает, только свапает бит за битом P>в то же время, как ты правильно заметил std::sort может использовать оптимизированный swap
И? Надо сделать довольно большое колическтво работы, которую обычно никто не делает. Просто потенциальная возможность очень мало когда имеет значение.
AS>>Что делать с компаратором, сложность которого выше чем сложность копирования? P>а что с ним делать на qsort?
Ничего, но возможность подстановок которая деклариуется в этом случае как основной плюс, не даст ровным счётом ничего.
AS>>Как-то так сложилось, что qsort не приводит к распуханию кода и выноса его за кэш. P>если это действительно проблема — то всё прекрасно решается в рамках C++ — почитай performance TR, и всё равно будет надёжный интерфейс, принимающий правильные компараторы и т.п.
Это действительно проблема. Но вот как-то так сложилось, что я пишу не на стандарте и других писульках коммитета, а не реальных компилерах. И как-то от не получается оно. Очень показательна в этом плане была GRETA. И понятно что оно решается. Ровно тем же способом что и удаление гландов через задний проход. )))
AS>>В С вот нет конструктора копирования и требований на exception-safe код, что бывает сильно раляет в сравнении. Если сортировать не целые числа ... то std::sort далеко не всегда так крут как хотелось бы некоторым. P>ээ... std::sort это лишь пример, что имхо очевидно. и дело тут вовсе не в алгоритме сортировки.
О... таки всего лишь пример, и всё очевидно? Ну тогда давайте перестанем рассмативать std::sort как пример, и больше не будет упоминать? ОК?!
AS>>Кстати С++, на минуточку, далеко не всегда инлайнит то что хотелось бы программеру. Что бывает несколько неприятно. Как-то помнится в одном жутко шаблоном коде NO_INLINE встречался существенно чаще чем inline ))) Иначе тормозил этот код просто ужасно. P>для этого используются compiler-specific options, типа force inline — один раз пишется макрос на каждый компилятор и всё
Э... я даже не знаю даже чего и сказать. Я как бы о том что практика показала, что инлайнинг не только добро но и очень даже себе зло, а в ответ получил нотацию что типа в каждом компилере макрос который может сделать force inline... Мы точно друг друга поняли?!
P>>>вот, тот же void*, те же проблемы — это стандартный способ решения этой задачи на C AS>>У меня только один вопрос, откуда такой мистический страх перед void* и макросами? P>страха нет. P>это тупо не type-safe, разве не очевидно? (есть и другие, но менее важные причины)
Нет не очевидно. Type-safe это что такое магическое заклинание? Не, не слышал ))))
P>может ли компаратор сравнивающий double, скомпилироваться вместе с int массивом?
Вот можно в С++ лёгким росчерком пера нарваться нарушение ODR, и скомпилировать код пользующиий совсем не ту структуру какую хотелось? Да легко. Чем монструознее софтина и больше программеров. И куда интересно подевалась это хвалёная типа безопасность?
Здравствуйте, Alexey Sudachen, Вы писали:
AS>в void* не надо верить его надо использовать или не использовать
Речь не о том, использовать или нет. А о том, что использовать везде void* довольно таки неудобно, но в С выбора то и нету.
AS>Таки C++ лет назад и C++ сейчас — разные языки. Более того если сейчас писать код на C++ как двацать лет назад — сразу получишь обвинение в говнокодерстве. ))))
От спасибо, Кэп!
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
Здравствуйте, Alexéy Sudachén, Вы писали:
AS>>>Аргументы против чего? P>>
P>>Потому что очень много низкокачественных C++ программистов (перешедших с C), которые
P>>верят в то, что C быстрее чем C++,
P>>верят в void* и т.п.,
P>>думают что C++ это раздутые OO-иерархии,
P>>могли обжечься 20 лет назад об C++ и этот опыт имеет их до сих пор.
P>>В результате, когда этот сброд слышит embedded, fast, system, kernel — они бездумно используют C.
AS>Иначе говоря на С программирует сброд? )))
сброд — это те, кто бездумно использует и тупо верит в мифы.
ещё раз:
На сегодняшний день я вижу только следующие места когда можно обоснованно использовать C, а не C++ :
1) Отсутствие компилятора C++
2) В API (причём это не сам C, а только C-style interfaces)
3) В распоряжении есть только программисты знающие C, но не C++
4) Необходимость ковыряться в уже написанном на C проекте
AS>при сравнении скорости C/C++ быстрее будет программист )))
здесь все оппоненты "защищающие" С, переходят в сферический вакуум, к пятнистым поням?
AS>в void* не надо верить его надо использовать или не использовать, ровно так же как RAII или статически полиморфизм. В С это ровно такая же идиома.
а теперь ещё раз:
Потому что очень много низкокачественных C++ программистов (перешедших с C), которые
"вера в void*" заключается в использовании его где не попадая. ты не поверишь, но многие считает чем более low-level код — тем более быстр. они отождествляют void* (так как самый что ни на есть low-level) с производительностью. это всё я и называю верой.
то что есть места, где его можно адекватно использовать — я не спорю
просто, часто он используется вообще не адекватно.
AS>С++ таки способствует раздутым OO иерархиям, фатальый баг реализации обьектности.
чем именно он способствует?
AS>Аллан Кей как-то сказал что когда создавал концепцию ООП, не имел в виду С++.
ну и?
AS>Таки C++ лет назад и C++ сейчас — разные языки. Более того если сейчас писать код на C++ как двацать лет назад — сразу получишь обвинение в говнокодерстве. ))))
это смотря как и кто писал двадцать лет назад
AS>>>Как и то, что С ровно так же лучше чем С++, как и наоборот. Чем лучше? Дык чем С++. ) P>>я уже не раз писал: надежностью, скоростью, безопасностью и т.п. AS>Есть такая штука, называется статически неустойчивая аэродинамика. Все современные истребители нуждающиеся в предельной манёвренности строятся по такой схеме. Дык вот С — это такой истребитель, С++ же в сравнении С, — пасажирский авиалайнер. С имеет предельную манёвренность, C++ — предельную статическую устойчивость.
давай ты спустишься со сферических турбулентных облаков, и перечислишь по пунктам то, что даёт манёвренность в C, ок?
а потом мы пройдёмся по этим пунктам, и посмотрим, было ли это такой уже добродетелью или тупо жёсткой необходимостью для латания дыр в обшивке. и какие альтернативы есть в C++, потеряли ли они что-то в "манёвренности" или наоборот улучшили её
Здравствуйте, Alexéy Sudachén, Вы писали:
AS>>>От только что делать с сортировкой тривиальных объектов, для которых не реализован swap, но по всем правилам реализован конструктор копирования? P>>qsort тут вообще ничего не предлагает, только свапает бит за битом P>>в то же время, как ты правильно заметил std::sort может использовать оптимизированный swap AS>И? Надо сделать довольно большое колическтво работы, которую обычно никто не делает. Просто потенциальная возможность очень мало когда имеет значение.
кто-то использует, кто-то нет. но возможность есть, чего не скажешь о qsort
AS>>>Что делать с компаратором, сложность которого выше чем сложность копирования? P>>а что с ним делать на qsort? AS>Ничего, но возможность подстановок которая деклариуется в этом случае как основной плюс, не даст ровным счётом ничего.
то есть объективно ты согласен, что есть более богатые возможности для реиспользования, так?
AS>>>Как-то так сложилось, что qsort не приводит к распуханию кода и выноса его за кэш. P>>если это действительно проблема — то всё прекрасно решается в рамках C++ — почитай performance TR, и всё равно будет надёжный интерфейс, принимающий правильные компараторы и т.п. AS>Это действительно проблема. Но вот как-то так сложилось, что я пишу не на стандарте и других писульках коммитета, а не реальных компилерах. И как-то от не получается оно. Очень показательна в этом плане была GRETA. И понятно что оно решается. Ровно тем же способом что и удаление гландов через задний проход. )))
сорри, не могу ничего сказать про качество твоего сравнения удаления гландов через задний проход(нету опыта) с одним из конкретных способов решения проблемы о которым ты думаешь(не знаю о чём именно думаешь)
AS>>>В С вот нет конструктора копирования и требований на exception-safe код, что бывает сильно раляет в сравнении. Если сортировать не целые числа ... то std::sort далеко не всегда так крут как хотелось бы некоторым. P>>ээ... std::sort это лишь пример, что имхо очевидно. и дело тут вовсе не в алгоритме сортировки. AS>О... таки всего лишь пример, и всё очевидно?
ты начал скатываться к конкретному алгоритму стоящему за std::sort, хотя очевидно было, что дело не в нём
AS>Ну тогда давайте перестанем рассмативать std::sort как пример, и больше не будет упоминать? ОК?!
ок, но сначала ответь, желательно с аргументами: qsort vs std::sort
1. что быстрее
2. что надёжней
3. что безопасней
4. что более абстрактно
?
AS>>>Кстати С++, на минуточку, далеко не всегда инлайнит то что хотелось бы программеру. Что бывает несколько неприятно. Как-то помнится в одном жутко шаблоном коде NO_INLINE встречался существенно чаще чем inline ))) Иначе тормозил этот код просто ужасно. P>>для этого используются compiler-specific options, типа force inline — один раз пишется макрос на каждый компилятор и всё
AS>Э... я даже не знаю даже чего и сказать. Я как бы о том что практика показала, что инлайнинг не только добро но и очень даже себе зло, а в ответ получил нотацию что типа в каждом компилере макрос который может сделать force inline... Мы точно друг друга поняли?!
и не только force inline, но и noinline
заметь, тут есть выбор — где-то для производительности важно одно, где-то другое.
в C же обычно этого выбора особо нет
Здравствуйте, Alexéy Sudachén, Вы писали:
P>>>>вот, тот же void*, те же проблемы — это стандартный способ решения этой задачи на C AS>>>У меня только один вопрос, откуда такой мистический страх перед void* и макросами? P>>страха нет. P>>это тупо не type-safe, разве не очевидно? (есть и другие, но менее важные причины) AS>Нет не очевидно. Type-safe это что такое магическое заклинание? Не, не слышал ))))
а type rich interfaces?
P>>может ли компаратор сравнивающий double, скомпилироваться вместе с int массивом? AS>Вот можно в С++ лёгким росчерком пера нарваться нарушение ODR, и скомпилировать код пользующиий совсем не ту структуру какую хотелось? Да легко. Чем монструознее софтина и больше программеров. И куда интересно подевалась это хвалёная типа безопасность?
AS>>при сравнении скорости C/C++ быстрее будет программист ))) P>здесь все оппоненты "защищающие" С, переходят в сферический вакуум, к пятнистым поням?
Угу, тем более что это так и есть (про программиста, а не про оппонентов).
P>"вера в void*" заключается в использовании его где не попадая. ты не поверишь, но многие считает чем более low-level код — тем более быстр. они отождествляют void* (так как самый что ни на есть low-level) с производительностью. это всё я и называю верой.
Ты это сами придумал, или где-то прочитал? Если сам, то как часто ты пишешь на так нелюбимом тобой С, что бы знать во что верят С-программеры? Обожаю людей которые допридумывают за оппонентов. С другой стороны, почему бы и нет. Довольно забавно получается.
AS>>С++ таки способствует раздутым OO иерархиям, фатальый баг реализации обьектности. P>чем именно он способствует? AS>>Аллан Кей как-то сказал что когда создавал концепцию ООП, не имел в виду С++. P>ну и?
Да не, ничё. ))) Забудь. Лениво мне эту тему развивать.
AS>>Таки C++ лет назад и C++ сейчас — разные языки. Более того если сейчас писать код на C++ как двацать лет назад — сразу получишь обвинение в говнокодерстве. )))) P>это смотря как и кто писал двадцать лет назад
Да? Ну вот как бы камрад СС считает что сие совершенно очевидно. )))
P>давай ты спустишься со сферических турбулентных облаков, и перечислишь по пунктам то, что даёт манёвренность в C, ок? P>а потом мы пройдёмся по этим пунктам, и посмотрим, было ли это такой уже добродетелью или тупо жёсткой необходимостью для латания дыр в обшивке. и какие альтернативы есть в C++, потеряли ли они что-то в "манёвренности" или наоборот улучшили её
А зачем, мне в метафорах интереснее ))) К тому же я ничего не доказываю, просто изгаляюсь над примитивизмом основной идеи флейма и её обоснованием. Уж на столько всё просто, что должно бы быть очевидно любому идиоту, дык пойди ж ты, оказывается периодически всплывают таки кому не очевидно )))) Это наверное всё те низкокачественные программисты что перешли с С. )))
AS>>>>У меня только один вопрос, откуда такой мистический страх перед void* и макросами? P>>>страха нет. P>>>это тупо не type-safe, разве не очевидно? (есть и другие, но менее важные причины) AS>>Нет не очевидно. Type-safe это что такое магическое заклинание? Не, не слышал )))) P>а type rich interfaces?
Это когда можно попить кофе пока а-цатаи процессорный монстер компилирует несколько строчек и код раздувается до эпических размеров... да что-то такое слышал.
P>>>может ли компаратор сравнивающий double, скомпилироваться вместе с int массивом? AS>>Вот можно в С++ лёгким росчерком пера нарваться нарушение ODR, и скомпилировать код пользующиий совсем не ту структуру какую хотелось? Да легко. Чем монструознее софтина и больше программеров. И куда интересно подевалась это хвалёная типа безопасность? P>мастер ухода от ответа 4го разряда
А ты думал. Однако, куда таки девается 'типА безопасность'?
Здравствуйте, Alexéy Sudachén, Вы писали:
P>>"вера в void*" заключается в использовании его где не попадая. ты не поверишь, но многие считает чем более low-level код — тем более быстр. они отождествляют void* (так как самый что ни на есть low-level) с производительностью. это всё я и называю верой. AS>Ты это сами придумал, или где-то прочитал? Если сам, то как часто ты пишешь на так нелюбимом тобой С, что бы знать во что верят С-программеры? Обожаю людей которые допридумывают за оппонентов. С другой стороны, почему бы и нет. Довольно забавно получается.
Потому что очень много низкокачественных C++ программистов (перешедших с C), которые
верят в то, что C быстрее чем C++, верят в void* и т.п.,
P>>давай ты спустишься со сферических турбулентных облаков, и перечислишь по пунктам то, что даёт манёвренность в C, ок? P>>а потом мы пройдёмся по этим пунктам, и посмотрим, было ли это такой уже добродетелью или тупо жёсткой необходимостью для латания дыр в обшивке. и какие альтернативы есть в C++, потеряли ли они что-то в "манёвренности" или наоборот улучшили её AS>А зачем, мне в метафорах интереснее ))) К тому же я ничего не доказываю, просто изгаляюсь над примитивизмом основной идеи флейма и её обоснованием. Уж на столько всё просто, что должно бы быть очевидно любому идиоту, дык пойди ж ты, оказывается периодически всплывают таки кому не очевидно )))) Это наверное всё те низкокачественные программисты что перешли с С. )))
я не считаю эту дискуссию бесполезной.
1. я как уже сказал, всё больше убеждаюсь что с другой стороны объективных аргументов нет. после вдалбливания, и разжёвывания что и почему является быстрее и надёжней, оппоненты глотатают антипопоболь, делают отчаянные попытки спасти остатки своей моральной устойчивости, и начинают щебетать что-то типа "скорость редко нужна"/"более лучшая применимость не нужна"/"да у вас вообще есть auto_ptr"/etc.
2. больше людей будут aware -> будет больше хорошего кода -> мир, зелёная травка
Здравствуйте, Alexéy Sudachén, Вы писали:
AS>Абстрактность вообще в статическую типизацию не то чтобы плохо лжится, но весьма с трудом запихивается. )))
STL статически типизирован(практически полностью), и при этом абстрактен
Здравствуйте, Alexéy Sudachén, Вы писали:
AS>>>>>У меня только один вопрос, откуда такой мистический страх перед void* и макросами? P>>>>страха нет. P>>>>это тупо не type-safe, разве не очевидно? (есть и другие, но менее важные причины) AS>>>Нет не очевидно. Type-safe это что такое магическое заклинание? Не, не слышал )))) P>>а type rich interfaces?
AS>Это когда можно попить кофе пока а-цатаи процессорный монстер компилирует несколько строчек
в грубом приближении — да. но, почему бы не делегировать часть своей работы этому монстрику?
AS>и код раздувается до эпических размеров...
нет
P>>>>может ли компаратор сравнивающий double, скомпилироваться вместе с int массивом? AS>>>Вот можно в С++ лёгким росчерком пера нарваться нарушение ODR, и скомпилировать код пользующиий совсем не ту структуру какую хотелось? Да легко. Чем монструознее софтина и больше программеров. И куда интересно подевалась это хвалёная типа безопасность? P>>мастер ухода от ответа 4го разряда AS>А ты думал.
я думал ты ответишь: P>>>>может ли компаратор сравнивающий double, скомпилироваться вместе с int массивом?
------- AS>Однако, куда таки девается 'типА безопасность'?
И видим что ты придумал веру в void* и низкокачественных программистов. И чего?
P>я не считаю эту дискуссию бесполезной. P>1. я как уже сказал, всё больше убеждаюсь что с другой стороны объективных аргументов нет. после вдалбливания, и разжёвывания что и почему является P>2. больше людей будут aware -> будет больше хорошего кода -> мир, зелёная травка
Типа пророк, популизатор, просветитель и борец с язычеством и ересью? Возвращатель заблудших душ в лоно веры страуса... бывает, да. Книжку написать не пробовал?
Каких аргументов ты хочешь, если для тебя 'типА безопастность' это бог, а тривиальщина а-ля std::sort евангилье? Ты разве готов слушать что-то выходящие за рамки правильной картины мира, построенной в догматах C++. Так что считай — не считай, но дискуссия бесполезна. Да и не дискуссия это. Ну на самом деле, с кем ты дискутировать то собрался? Тот всего несколько человек с тобой будут 'дискутировать' и то по приколу.
AS>И видим что ты придумал веру в void* и низкокачественных программистов. И чего?
а то, что я про void* говорил в контексте C++, но ты этого не заметил...
AS>Каких аргументов ты хочешь,
объективных
AS>если для тебя 'типА безопастность' это бог,
возможность сэкономить время
AS>а тривиальщина а-ля std::sort евангилье?
маленький пример C++style в контексте сравнения с C.
и кстати, эта тривиальнщина далеко не для всех тривиальщина. многие думают(и в этом топике в том чилсе) что более абстраный код <-> более медленный.
AS>Ты разве готов слушать что-то выходящие за рамки правильной картины мира, построенной в догматах C++.
конечно
AS>Так что считай — не считай, но дискуссия бесполезна. Да и не дискуссия это. Ну на самом деле, с кем ты дискутировать то собрался? Тот всего несколько человек с тобой будут 'дискутировать' и то по приколу.
ну так я тоже тут, "по приколу", бывает интересные мысли проскакивают
и ты не поверишь, но мне некоторые из твоих идей тоже интересны, не смотря на то, что они спрятаны за фасадом ... не знаю, как лучше назвать это фасад, пусть просто будет фасад
Здравствуйте, Piko, Вы писали:
P>ок, но сначала ответь, желательно с аргументами: qsort vs std::sort P>1. что быстрее
Зависит от задачи и от программиста
P>2. что надёжней
Зависит от задачи и от программиста
P>3. что безопасней
Зависит от задачи и от программиста
P>4. что более абстрактно
std::sort
P>?
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, Alexey Sudachen, Вы писали:
AS>С++ настолько же надёжен и безопасен как и ассемблер.
Пацталом. Ты что то там про знания С++ говорил? Щас похоже ты нам их продемонстрируешь.
AS> Это факт установленный эмперически
Где можно ознакомиться с этими эмпирически установленными фактами?
AS> просто существуют разные мифы что путём некоторых заклинаний можно сделать код абстрактно надёжно-безопасным. От только корка, как истина в последней инстанции, показыает что это именно что миф.
Пруф или GTFO!
AS>Абстрактность вообще в статическую типизацию не то чтобы плохо лжится, но весьма с трудом запихивается.
Какими ещё глубинами "знанимй" нас порадуешь?
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
Здравствуйте, Alexey Sudachen, Вы писали:
AS>Это когда можно попить кофе пока а-цатаи процессорный монстер компилирует несколько строчек и код раздувается до эпических размеров... да что-то такое слышал.
Интересу ради, какой у тебя там год на календаре?
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
P>>>ок, но сначала ответь, желательно с аргументами: qsort vs std::sЗort P>>>1. что быстрее E>>Зависит от задачи и от программиста P>в каких случаях qsort, по твоему мнению, быстрее?
#include <stdlib.h>
#include <stdio.h>
#include <algorithm>
#include <vector>
#include <time.h>
using namespace std;
struct X {
vector<long> q_;
X(int n) { q_.resize(n); for ( int i=0; i < q_.size(); ++i ) q_[i] = rand(); }
X(const X &x) { for( int i=0; i < x.q_.size(); ++i ) q_.push_back(x.q_[i]); }
};
int N_sum(const vector<long> &q) { int N = 0; for ( int i = 0; i < q.size(); ++i ) N += q[i]; return N; }
struct Y{
int N;
Y(const X x) { N = N_sum(x.q_); }
};
bool operator < (const Y& a, const Y b){
return a.N < b.N;
}
int X_sum_comp(const X *a,const X *b) {
return N_sum(a->q_) - N_sum(b->q_);
}
int main(int argc, char **argv){
if ( argc < 2 ) exit(-1);
int n = strtol(argv[1],0,0);
vector<X> x;
for ( int i = 0; i < n; ++i ) x.push_back(X(n));
vector<X> y = x;
double c0 = clock();
sort(x.begin(),x.end());
double c1 = clock();
qsort(&y[0],y.size(),sizeof(y[0]),(int(*)(const void*,const void*))X_sum_comp);
double c2 = clock();
printf("sort: %.3f, qsort: %.3f\n",(c1-c0)/CLOCKS_PER_SEC,(c2-c1)/CLOCKS_PER_SEC);
}
P>>>2. что надёжней E>>Зависит от задачи и от программиста P>в каких случаях qsort, по твоему, мнению надёжней? P>в каких случаях qsort, по твоему, мнению безопасней?
Критерии для надёжности и безопасности пожалуйста в студию. Иначе можно с таким же успехом спрашивать что и них пушистее и овальнее.
AS>>Абстрактность вообще в статическую типизацию не то чтобы плохо лжится, но весьма с трудом запихивается. ))) P>STL статически типизирован(практически полностью), и при этом абстрактен
Ой ли! Ну то есть я могу сделать вектор содержащий строку, число и другой вектор?! Крута, да!
Критерий абстрактности в студию, пожалуйста!
int main(int argc, char **argv){
AS> if ( argc < 2 ) exit(-1);
AS> int n = strtol(argv[1],0,0);
AS> vector<X> x;
AS> for ( int i = 0; i < n; ++i ) x.push_back(X(n));
AS>
Для тех, кто не понял что этот код делает, и получает краш на больших числах =) чуток поменяйте строчку и будет счастье. На суть проблемы это всёравно не влияет, но вот память действительно не резиновая.
for ( int i = 0; i < n; ++i ) x.push_back(X(n%101));
Здравствуйте, CreatorCray, Вы писали:
E>>>>>>У большинства это от недостатка опыта, и постепенно проходит, но у некоторых не проходит никогда... CC>>>>>Оставь этот менторский тон. Он не действует как ты рассчитываешь. E>>ПО существу, тем не менее, ты со мной согласился... CC>Тебе похоже хочется выдать желаемое за действительное. CC>Говорю прямым текстом: я с тобой не согласен, и считаю что ты это написал троллинга ради.
Не затруднит пояснить с чем конкретно ты не согласен и почему? Ну кроме тона...
CC>Советовать.
IMHO, советую как-то иначе, в иных тонах и наклонениях и т. п...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, Alexéy Sudachén, Вы писали:
P>>>>ок, но сначала ответь, желательно с аргументами: qsort vs std::sЗort P>>>>1. что быстрее E>>>Зависит от задачи и от программиста P>>в каких случаях qsort, по твоему мнению, быстрее?
AS> X(const X &x) { for( int i=0; i < x.q_.size(); ++i ) q_.push_back(x.q_[i]); } AS> qsort(&y[0],y.size(),sizeof(y[0]),(int(*)(const void*,const void*))X_sum_comp);
шутник, UB'шник
P>>>>2. что надёжней E>>>Зависит от задачи и от программиста P>>в каких случаях qsort, по твоему, мнению надёжней? P>>в каких случаях qsort, по твоему, мнению безопасней? AS>Критерии для надёжности и безопасности пожалуйста в студию. Иначе можно с таким же успехом спрашивать что и них пушистее и овальнее.
уже писал.
вкратце: надёжность — больше ошибок(классов ошибок) ловится compile-time. безопасность — менее подверженность vulnerabilities.
но это вкратце
Здравствуйте, Alexéy Sudachén, Вы писали:
AS>>>Абстрактность вообще в статическую типизацию не то чтобы плохо лжится, но весьма с трудом запихивается. ))) P>>STL статически типизирован(практически полностью), и при этом абстрактен
AS>Ой ли! Ну то есть я могу сделать вектор содержащий строку, число и другой вектор?! Крута, да! AS>Критерий абстрактности в студию, пожалуйста!
Абстра́кция (от лат. abstractio — отвлечение) — отвлечение в процессе познания от несущественных сторон, свойств, связей объекта (предмета или явления) с целью выделения их существенных, закономерных признаков; абстрагирование; теоретическое обобщение как результат такого отвлечения.
Здравствуйте, Piko, Вы писали:
P>в каких случаях qsort, по твоему мнению, быстрее?
Слушайте, люди, вы меня правда пугаете.
Ты сам не можешь написать пример в котором qsort порвёт std::sort?
Хочешь совет? Напиши пример где функция сравнения ДОЛГАЯ.
Например, у тебя есть массив неотрицательных чисел,
чтобы сравнить два, ты от каждого вычисляешь exp( x / x_max ), с точностью 1 000 000 знаков, и потом в лексографическом с конца порядке сортируешь. Ну и чисел тысяч 10 хотя бы в массиве
Вот, что бы лучше думалось, попробуй угадать, что вернёт функция RN_test:
class RandNum {
int body;
static int countCpp;
static int countC;
public:
RandNum() : body( rand() ) {}
bool operator < ( const RandNum& other ) const
{ countCpp++; return body < other.body; }
static int CmpImpl( const RandNum* arg1, const RandNum* arg2 )
{ countC++; return arg1->body - arg2->body; }
static int Cmp( const void* arg1, const void* arg2 ) { return CmpImpl( (const RandNum*) arg1, (const RandNum*) arg2 ); }
static const int CppCount() { return countCpp; }
static const int CCount() { return countC; }
};
int RandNum::countC = 0;
int RandNum::countCpp = 0;
int RN_test( int n = 1000 )
{
std::vector<RandNum> arrCpp;
for( int i = 0; i < n; i++ ) {
arrCpp.push_back( RandNum() );
}
std::vector<RandNum> arrC( arrCpp );
qsort( &arrC[0], arrC.size(), sizeof( RandNum ), RandNum::Cmp );
std::sort( arrCpp.begin(), arrCpp.end() );
return RandNum::CppCount() * 100 / RandNum::CCount();
}
у меня, например, возвращает 182%
P>в каких случаях qsort, по твоему, мнению надёжней?
По моему мнению для всех. Ещё надёжнее, будет если её немножко шаблонно обернуть, но даже в чистом С-варианте она неверно работает только если передать не так буфер или напутать с типами. В std::sort способов накрячится есть просто невообразимое множество
P>>>3. что безопасней E>>Зависит от задачи и от программиста
P>в каких случаях qsort, по твоему, мнению безопасней?
А что значит "безопаснее"? Какая модель угроз?
Не, ну правда, скажите, что вы просто в полемическом запале немного троллили, а не на полном серьёзе считали, что std::sort быстрее qsort'а?
Я же совсем веру в коллег потеряю!
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, Piko, Вы писали:
P>уже писал. P>вкратце: надёжность — больше ошибок(классов ошибок) ловится compile-time.
Я не согласен что это надёжность. Или поясни, что такое compile-time? Входит ли в него время прогона статических анализаторов кода и юнит-тестов?
P>безопасность — менее подверженность vulnerabilities. P>но это вкратце
Я не совсем понимаю, как qsort или std::sort могут быть опасными, тогда...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, Piko, Вы писали:
P>идея зачётная но, к дискуссии имеет мало отношения P>это уже разница самих алгоритмов(вытекающих из интерфейсов). с тем же успехом, можно имея только предикат less, реализовать через него компаратор для qsort. P>с этой точки зрения пример не удачный, имхо очевидно P>с тем же успехом можно взять хорошую реализацию qsort, и плохую sort, эта тема уже обсуждалась в начале топика
А я считаю, что имеет.
1) Ты тут всем вслед за Страуструпом проел всем плешь, что qsort медленнее std::sort, хотя для долгих операций сравнения это просто ПРЯМАЯ ЛОЖЬ.
Мне было смешно тебя читать, и все эти ужимки про то, что тормоз порвёт скорохода.
Страуструп всех просто немного подколол, он это любит, а вот ты тоже дурачился или на голубом глазу повёлся?
Если второе, то это очень неплохая иллюстрация, что С++ код и подхд к программированию СКРЫВАЕТ ОТ ПРОГРАММИСТА СУТЬ ДЕЛА, и это его главный и основной недостаток...
2) Про плохую и хорошую реализацию. Мы таки несём STL на помоечку или как? И то и то стандартные средства своих языков, а не поделки криворуких тенденциозных тестеров, вообще-то. И авторы стандарта С++ и STL, и самого std::sort конечно же понимали, что они пессимизируют свой код примерно в два раза, по сравнению с С, но при этом они вынужденно пошли на это, стыдливо прикрывшись подстановкой функций обмена и сравнения
Как ты думаешь, зачем std::sort в STL cделан тормозом?
P>ога, или с размером массива, или с размерам типа ...
Ну надо контролировать тип, это можно поручить статическому анализатору или макросу, а в С++ ещё и простому шаблону-обёртке.
E>>Ещё надёжнее, будет если её немножко шаблонно обернуть
P>то есть ты согласен, что на C++ она была бы надёжней?
Нет не согласен. На С++ писали бы как на С++ и получили бы в конце std::sort E>>В std::sort способов накрячится есть просто невообразимое множество
P>не хочу опять начинать с тобой спорить на эту тему (ты же про duck-typing, отсутствие концепций и т.п.?). P>но, вопрос: где по-твоему мнению программисты ошибаются чаще? с qsort или sort? P>не количество возможных путей и бла-бла, а именно на практике что надёжней.
Я не согласен с твоим определением надёжности, но я думаю, что в готовом оттестированном коде ошибки с std::sort остаются чаще, чем с qsort...
Но тут надо учесть, что вызвать std::sort для vector<bool> я считаю ГРУБОЙ ошибкой. Но она на С++ скорее всего никогда не будет выявлена, если только случайно, в то время как на С ей вообще не удастся закодировать...
P>тот же buffer overflow
Очевидно, что неверные границы буфера можно передать в оба алгоритма...
Мало того, если в С-шный передают счётчик, что даёт надежду, что он будет сортировать не всю память, а посортирует какой-то кусок и расслабится, то в С++ный передают пару итераторов. Если они будут от разных массивов, то приятной вам отладки
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, Erop, Вы писали:
P>>уже писал. P>>вкратце: надёжность — больше ошибок(классов ошибок) ловится compile-time. E>Я не согласен что это надёжность. Или поясни, что такое compile-time? Входит ли в него время прогона статических анализаторов кода и юнит-тестов?
нет, не входят.
юнит-тесты — это во-превых runtime тесты, во-вторых их ещё необходимо написать. а например в случае sort мы получаем compile-time проверки без дополнительных усилий, и даже наоборот — его проще использовать.
статические анализаторы кода ловят далеко не все те ошибки, которые можно поймать используя типизацию и т.п.
хотя бы тупо по тому, что они могут не знать где есть ошибка, а где нет.
вот например, параметром функции является возраст, в случае с С, в каждой функции принимающей возраст нужно делать проверку. В случае C++ будет просто класс Age, и внутри функции не о чём не нужно парится. (можно даже использовать различные трюки, чтобы ловить конструкцию Age с неправильным возрастом compile time, но не об этом речь). И как тут поможет статический анализатор кода??
P>>безопасность — менее подверженность vulnerabilities. P>>но это вкратце E>Я не совсем понимаю, как qsort или std::sort могут быть опасными, тогда...
в qsort всегда нужно передавать размер массива, и элемента -> проще ошибиться и получить overflow
в std::sort конечно тоже можно ошибиться с границей, но имхо — это намного реже происходит, во вторых не нужно передавать размер элемента, и в третьих "unit-test" внутрb sort, для debug, легче добавить проверку диапазона — что и делается в некоторых реализациях.
Т.е. ты тут упираешь на то, что алгоритмически qsort и std::sort отличаются, и у qsort в твоём случае колво вызовов компаратора меньше.
А речь шла об интерфейсе вызова.
Т.е. для правильного сравнения надо брать алгоритм qsort и модифицировать его в тот вид, в котором юзеру вытарчивает std::sort, т.е.
E>>>>>Зависит от задачи и от программиста P>>>>в каких случаях qsort, по твоему мнению, быстрее? AS>>> X(const X &x) { for( int i=0; i < x.q_.size(); ++i ) q_.push_back(x.q_[i]); } AS>>> qsort(&y[0],y.size(),sizeof(y[0]),(int(*)(const void*,const void*))X_sum_comp); P>>шутник, UB'шник
Ну вот, опять догматы... таки не готов ты пока смотреть за шоры. ))) Всего осталного ты не заметил?
P>
P>bool operator < (const X& a, const X &b){
P>void swap(X &l,X &r){
P>
P>и sort рвёт qsort, и при том без UB
Вот прямо рвёт? ))) Может таки работает с статистически незначительной разницей, особенно с учётом что там разные алгоритмы? Или сливает, если программист забыл или сделал ОДНУ опечатку. Однако очень надёжно и безопастно. )))
Здравствуйте, Alexéy Sudachén, Вы писали:
E>>>>>>Зависит от задачи и от программиста P>>>>>в каких случаях qsort, по твоему мнению, быстрее? AS>>>> X(const X &x) { for( int i=0; i < x.q_.size(); ++i ) q_.push_back(x.q_[i]); } AS>>>> qsort(&y[0],y.size(),sizeof(y[0]),(int(*)(const void*,const void*))X_sum_comp); P>>>шутник, UB'шник AS>Ну вот, опять догматы...
какие догматы — насколько я помню побитовое копирование non-POD — UB, но могу ошибаться
AS>таки не готов ты пока смотреть за шоры. ))) Всего осталного ты не заметил?
чего? отсутствие "&" ? заметил, отчасти поэтому и сделал отдельный operator<
P>>
P>>bool operator < (const X& a, const X &b){
P>>void swap(X &l,X &r){
P>>
P>>и sort рвёт qsort, и при том без UB AS>Вот прямо рвёт? ))) Может таки работает с статистически незначительной разницей, особенно с учётом что там разные алгоритмы?
это уже действительно уныло
AS>Или сливает, если программист забыл или сделал ОДНУ опечатку. Однако очень надёжно и безопастно. )))
int X_sum_comp(const X *a,const X *b) {
return N_sum(a->q_) - N_sum(b->q_);
}
CC>Т.е. ты тут упираешь на то, что алгоритмически qsort и std::sort отличаются, и у qsort в твоём случае колво вызовов компаратора меньше.
Я упираю совсем не на это.
CC>А речь шла об интерфейсе вызова.
ДА, именно об этом. ИМХО, код — истина в последней инстанции. Мне к нему вобщем-то добавить нечего. Скушно это, каждую закорючку обьеснять, всё равно что обьяснять шутки ))))
Здравствуйте, Alexéy Sudachén, Вы писали:
P>>это уже действительно уныло P>>перепутал "-" на "+" и "шеф, усё пропало" AS>Что ты там говорл про кнопку бачка?
просто это:
AS>Вот прямо рвёт? ))) Может таки работает с статистически незначительной разницей, особенно с учётом что там разные алгоритмы?
действительно уныло, так как я здесь ни раз говорил "при одинаковых алгоритмах"
AS>>>Вот прямо рвёт? ))) Может таки работает с статистически незначительной разницей, особенно с учётом что там разные алгоритмы?
P>>действительно уныло, так как я здесь ни раз говорил "при одинаковых алгоритмах" AS>Именно это я и уточнил. Уточнил что мы говорим о языке а не о алгоритмике. AS>Так что свою унылость ты можешь отнести к тому же бачку.
AS>>В С вот нет конструктора копирования и требований на exception-safe код, что бывает сильно раляет в сравнении. Если сортировать не целые числа ... то std::sort далеко не всегда так крут как хотелось бы некоторым.
P>ээ... std::sort это лишь пример, что имхо очевидно. и дело тут вовсе не в алгоритме сортировки.
P>>>>Понимаете, для сортировки есть разные алгоритмы, разные реализации std::sort
1>>>Ну я то тут причем? Это вы ведь приводите исследование их сравнивающее. Причем уже во второй раз. На Си там быстрая сортировка.
P>>я согласен, просто сравнение скорости std::sort и qsort из какой-нибудь реализации не полностью честно.
P>>Но, идея в том, что если взять одинаковые алгоритмы, один из которых обвернуть в qsort, другой в std::sort, std::sort будет быстрее.
1>Но это си. Здесь нельзя ничего обернуть не получив проигрыша в скорости. Но если взять одинаковые алгоритмы, хорошо написанные, то 1>скорость либо будет одинаковой либо у С больше.
AS>>>>В С вот нет конструктора копирования и требований на exception-safe код, что бывает сильно раляет в сравнении. Если сортировать не целые числа ... то std::sort далеко не всегда так крут как хотелось бы некоторым.
P>>>ээ... std::sort это лишь пример, что имхо очевидно. и дело тут вовсе не в алгоритме сортировки.
AS>Ну, то есть ты не понимаешь что специфика конструкторов, операторов и ограничений на обработку исключений к алгоритму сортировки не относится, но влияет на скорость и валидность?
что ты хочешь сказать?
AS>И никакая 'типа надёжность' тебя не спасёт от тривиальной опечатки или забывчивости.
спасёт, но не от всего
AS>Ровно так же как и в С. По корке же вся эта магия только усложнит поиск проблемы. Я тебе написал пример, и что? Всё что ты увидел это UB, которого в С, с которым мы сравниваем, просто нет.
так там нет и конструкторов , которые в твоей структуре были
а что, я ещё должен был увидеть? опечатки с сылками? да, я их сразу увидел, хочешь верь, хочешь нет
AS>Увидел что можно дописать пару заклинаний... вот только самого примера ты не увидел.
примера опечаток? или чего?
AS>Когда скорость и корректность работы строчки кода зависит от наличия/отсутствия в области видимости неких заклинаний... это нечто, да. )))
во-первых — можно потребовать реализацию "заклинаний", убрав дефолтовые.
во-вторых можно потребовать, чтобы были конкретные сигнатуры
Здравствуйте, Piko, Вы писали:
P>нет, не входят.
Тогда какой смысл выделять именно те ошибки, которые находятся при компиляции?
P>юнит-тесты — это во-превых runtime тесты, во-вторых их ещё необходимо написать. а например в случае sort мы получаем compile-time проверки без дополнительных усилий, и даже наоборот — его проще использовать.
Это самообман. Что бы его потом было "проще использовать" тебе понадобится написать кучу всякой хрени.
P>статические анализаторы кода ловят далеко не все те ошибки, которые можно поймать используя типизацию и т.п.
Ну лучше всего ошибки ловят, тем не менее, тесты. Они же лучше всего описывают поведение.
Ты просто почему-то считаешь, что кодирование требований к коду в системе типов бесплатное. А если посмотреть на С++ с его шаблонами и наворотами в библиотеках, то оно очень сильно платное и вообще непростое и череватое своими специфическими ошибками.
И чем ошибка "почему у меня не компилируется bind" лучше ошибки, что не работает такая-то С-библиотека -- не понятно.
P>вот например, параметром функции является возраст, в случае с С, в каждой функции принимающей возраст нужно делать проверку. В случае C++ будет просто класс Age, и внутри функции не о чём не нужно парится. (можно даже использовать различные трюки, чтобы ловить конструкцию Age с неправильным возрастом compile time, но не об этом речь). И как тут поможет статический анализатор кода??
И чё, кто-то в продакшине так делает?
Все пишут assert's и всё...
P>в qsort всегда нужно передавать размер массива, и элемента -> проще ошибиться и получить overflow P>в std::sort конечно тоже можно ошибиться с границей, но имхо — это намного реже происходит,
Почему? Ровно наоборот. Если в программе есть несколько массивов чисел, например, то ситуаци, когда они все имеют равные или близкие размеры весьма распространена. Так что если ты передашь размер не от того массива, то получишь намного менее фатальную проблему, чем если передашь end не от того массива
P>во вторых не нужно передавать размер элемента, и в третьих "unit-test" внутрb sort, для debug, легче добавить проверку диапазона — что и делается в некоторых реализациях.
В С тоже есть средства, ловли оращения мимо буферов...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Во-первых, мат тут запрещён!
P>вот это выводы: в одном случае компаратор tristate — в другом обычный предикат, и ты из этого делаешь вывод, что С++ код и подхд к программированию СКРЫВАЕТ ОТ ПРОГРАММИСТА СУТЬ ДЕЛА
Во-вторых, попробуй подышать, успокоиться и прочитать то, что писал я, а не продиктовали тебе твои эмоции.
Я писал, что если Страуструпу удалось ввести тебя в заблуждение, то это хорошо иллюстрирует насколько С++ сильно скрывает суть дела от программистов. Ты же считаешь себя опытным программистом, я надеюсь?
или ты всё это время троллил, в след за Бьярне?..
Ну и главное, что за вспышка эмоций-то? Я в таком тоне беседовать не хочу. Давай ты подышишь, покипишь, выпустишь пар, а потом взвешенно попробуешь понять, как так получилось, что ты вс время приводил аргумент против себя. И расскажешь всем нам, что помешало тебе сразу заметить, что тебя водят за нос.
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
P>и сравни qsort, sort и stable_sort, раз уж мы об алгоритмах заговорили и об C++way P>у stable_sort почти в три раз меньше вызовов предиката чем вызовов компаратора у qsort. P>и что теперь? P>я жду новых чудесных выводов с твоей стороны
Ну ты прекрасно показал, что твоё первоначальное "std::sort всегда быстрее qsort" девальвировало до "std::stable_sort на моём компиляторе и в релиз версии лучше qsort на очень длинных ОБРАТНО УПОРЯДОЧЕННЫХ последовательностях".
Не могу не заметить, что это, конечно очень ценное свойство, но reverse вообще в компараторе на этих данных не нуждается и всё прекрасно сортирует
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, CreatorCray, Вы писали:
CC>Сколько бы у тебя опыта не было — недостаток автоматики в С это никак не исправляет. С этим можно только смириться и писать всё руками.
Обсуждалось совсем другое, вроде как.
А так, да, можешь считать, что С-программы намного в болььшей степени hand-made, потому и хороши. Я вот, например, люблю свитера ручной вязки, хотя большинство остального трикотажа предпочитаю фабричной выделки. Тут, насколько я понимаю приверженцев С, примерно такая же фигня. Выписанность кода руками вообще не считается недостатком, это достоинство.
CC>Тон бывает в устной речи. Как его углядеть в тексте —
Разве не ты начал про тон?..
IMHO, тебе есть о чём с собой поговорить...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, Erop, Вы писали:
E>>>Или поясни, что такое compile-time? Входит ли в него время прогона статических анализаторов кода и юнит-тестов? P>>нет, не входят. E>Тогда какой смысл выделять именно те ошибки, которые находятся при компиляции?
самый передний фронт защиты.
P>>статические анализаторы кода ловят далеко не все те ошибки, которые можно поймать используя типизацию и т.п. E>Ну лучше всего ошибки ловят, тем не менее, тесты. Они же лучше всего описывают поведение. E>Ты просто почему-то считаешь, что кодирование требований к коду в системе типов бесплатное.
не бесплатное, но имхо дешевле юнит тестов. и один раз закодированный тип используется многократно без проблем, когда юнит тесты нужно писать на весь новый код.
E>А если посмотреть на С++ с его шаблонами и наворотами в библиотеках, то оно очень сильно платное и вообще непростое и череватое своими специфическими ошибками.
да какие навороты? простой класс Age, наворот?
E>И чем ошибка "почему у меня не компилируется bind" лучше ошибки, что не работает такая-то С-библиотека -- не понятно.
"не работает" может случится у клиента, если тесты профукали. а "не компилируется bind" — видно сразу
P>>вот например, параметром функции является возраст, в случае с С, в каждой функции принимающей возраст нужно делать проверку. В случае C++ будет просто класс Age, и внутри функции не о чём не нужно парится. (можно даже использовать различные трюки, чтобы ловить конструкцию Age с неправильным возрастом compile time, но не об этом речь). И как тут поможет статический анализатор кода?? E>И чё, кто-то в продакшине так делает?
как? использует классы с инвариантами?
E>Все пишут assert's и всё...
жесть. то есть в каждой функции которая принимает "int age", копипастится assert
Здравствуйте, CreatorCray, Вы писали:
CC>template<class _RanIt, class _Pr> void sort (_RanIt _First, _RanIt _Last, _Pr _Pred)
CC>Тогда сравним то, о чём на самом деле ведётся речь.
Суть в том, что на С и С++ пишут ПО РАЗНОМУ.
Но прикольно тут не это, а то, что вам с Пико было не очевидно, как получить пример тормозов std::sort'а...
или ты таки стебался?
Сначала я думал, что вы прикалываетесь, но когда я понял, что вы и правда не видите, что std::sort пессимизирован в угоду красоте и реюзабельности кода, я просто показал вам код и пример.
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, Erop, Вы писали:
P>>вот это выводы: в одном случае компаратор tristate — в другом обычный предикат, и ты из этого делаешь вывод, что С++ код и подхд к программированию СКРЫВАЕТ ОТ ПРОГРАММИСТА СУТЬ ДЕЛА E>Я писал, что если Страуструпу удалось ввести тебя в заблуждение, то это хорошо иллюстрирует насколько С++ сильно скрывает суть дела от программистов.
чем ему удалось ввести меня в заблуждение? и в какое заблуждение?
конкретно
Здравствуйте, Erop, Вы писали:
E>Ну ты прекрасно показал, что твоё первоначальное "std::sort всегда быстрее qsort" девальвировало до "std::stable_sort на моём компиляторе и в релиз версии лучше qsort на очень длинных ОБРАТНО УПОРЯДОЧЕННЫХ последовательностях".
Здравствуйте, Piko, Вы писали:
E>>Тогда какой смысл выделять именно те ошибки, которые находятся при компиляции? P>самый передний фронт защиты.
Это не иллюзия даже, это просто фейл. Ошики надо начинать намного раньше, чем случилась компиляция, чего бы то ни было, и даже раньше начала кодирования...
P>не бесплатное, но имхо дешевле юнит тестов. и один раз закодированный тип используется многократно без проблем, когда юнит тесты нужно писать на весь новый код.
Ну ты можешь попробовать написать юнит-тест на свой тип, и гарантировать его работоспособность тестированием, а не типизацией. Откуда уверенность, что это дороже/хуже/ненадёжнее?
P>да какие навороты? простой класс Age, наворот?
Для числа?
Конечно наворот и пессимизация!
Правда в С++ можно сделать и так
В С, как и в "С++ для не слишком умных" можно просто написать
int IsValidAge( int );
и потом писать везде на входе в функции
assert( IsValidAge( age ) );
P>"не работает" может случится у клиента, если тесты профукали. а "не компилируется bind" — видно сразу
C++ умеет плодить ошибки, которые проявляются крайне редко. Скажем зависимость от порядка инициализации/деинициализации статических переменных...
Ограниченная проверка соблюдени ODR и много других, которые в С в принципе не возможны.
При этом цикл разработки на С подразумевает более тщательное тестирование
P>как? использует классы с инвариантами?
Пишет класс для возраста.
P>жесть. то есть в каждой функции которая принимает "int age", копипастится assert
Почему копипастится? Обычно у функций параметры называются по-разному, кстати.
Вообще есть такой подход, на входе в функцию -- проверка параметров, на выходе -- проверка результатов...
Он намного эффективнее статических типов
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, Piko, Вы писали:
P>чем ему удалось ввести меня в заблуждение? и в какое заблуждение? P>конкретно
Что std::sort всегда быстрее qsort...
Ты вроде это довольно долго и последовательно утверждал?..
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, Piko, Вы писали:
P>Здравствуйте, Erop, Вы писали:
P>>>ок, но сначала ответь, желательно с аргументами: qsort vs std::sort P>>>1. что быстрее E>>Зависит от задачи и от программиста
P>в каких случаях qsort, по твоему мнению, быстрее?
Конкретно вот тут ты что имел в виду? Что шарики имеют форму кубиков но в другом метрическом пространстве?
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, Erop, Вы писали:
E>Здравствуйте, Piko, Вы писали:
E>>>Тогда какой смысл выделять именно те ошибки, которые находятся при компиляции? P>>самый передний фронт защиты. E>Это не иллюзия даже, это просто фейл. Ошики надо начинать намного раньше, чем случилась компиляция, чего бы то ни было, и даже раньше начала кодирования...
ээ, как бы компилятор ошибки дизайна не находят. дизайн не избавляет от опечаток, перестановок параметров, забытого ассерт и т.д.
я думал очевидно о какого рода ошибках идёт речь
P>>не бесплатное, но имхо дешевле юнит тестов. и один раз закодированный тип используется многократно без проблем, когда юнит тесты нужно писать на весь новый код. E>Ну ты можешь попробовать написать юнит-тест на свой тип, и гарантировать его работоспособность тестированием, а не типизацией. Откуда уверенность, что это дороже/хуже/ненадёжнее?
этот юнит тест будет проверять все места использования типа ??
P>>да какие навороты? простой класс Age, наворот? E>Для числа?
внутри Age, по-идеи одно число
E>Конечно наворот и пессимизация!
жесть
E>В С, как и в "С++ для не слишком умных" можно просто написать
int IsValidAge( int );
и потом писать везде на входе в функции
assert( IsValidAge( age ) );
делать это в каждой функции????
ок, хорошо, нашли чёткого программиста который не забывает ставить ассерт, ладно, допустим.
далее есть функция
int f(int age, int level);// где level - это допустим "уровень" работника по внутренней шкале фирмы, допустим от 1 до 50.
ок, это чоткий парень пишет
assert(IsValidAge( age ));
assert(IsValidLevel( level ));
ведь он так чёток, правда? не хуже брюса вилиса, ога.
и далее внутри этой функции нужно вызвать
int g(int level, int age);
при том, что пришли level и age которые допустимые в обоих диапазонах.
и что? его чёткости хватит на то, чтобы не перепутать местами здесь параметры?
насколько длинна его чёткость? На сколько его памяти хватит чтобы держать все эти контексты в голове?
какой бы длинной не была его чёткость, рано или поздно её не хватит
E>>>И чё, кто-то в продакшине так делает? P>>как? использует классы с инвариантами? E>Пишет класс для возраста.
а в чём проблема? (при том, что в примере выше, код проверки range будет общим для age и level)
P>>жесть. то есть в каждой функции которая принимает "int age", копипастится assert E>Почему копипастится? Обычно у функций параметры называются по-разному, кстати.
ога, добавляем разные именна в контекста для слежки чёткого пацана. А что? он же чёткий — всё запомнит, всё проверит.
E>Вообще есть такой подход, на входе в функцию -- проверка параметров, на выходе -- проверка результатов... E>Он намного эффективнее статических типов
Здравствуйте, Erop, Вы писали:
P>>>>ок, но сначала ответь, желательно с аргументами: qsort vs std::sort P>>>>1. что быстрее E>>>Зависит от задачи и от программиста P>>в каких случаях qsort, по твоему мнению, быстрее? E>Конкретно вот тут ты что имел в виду? Что шарики имеют форму кубиков но в другом метрическом пространстве?
я везде не копипастил оговорку — так как надоедает и должно быть очевидно.
так как не говорил об конкретном компиляторе и реализации, то я думал очевидно, что речь идёт об интерфейсе и одинаковых алгоритмах.
а иначе можно взять быстрый qsort, и std::sort внутри которого sleep стоит, либо debug_lt и ещё какая-нибудь хрень. и в чём тогда смысл?
Я всё таки стараюсь уважать сообразительность собеседников и не разжёвывать очевидные вещи
Здравствуйте, Piko, Вы писали:
P>ээ, как бы компилятор ошибки дизайна не находят. дизайн не избавляет от опечаток, перестановок параметров, забытого ассерт и т.д. P>я думал очевидно о какого рода ошибках идёт речь
Ты вообще очень непонятно выражаешь мысли, если честно. Так что не понятно. В частности не понятно, почему именно ошибки компиляции так важны.
Обычно как бывает? Система проектируется, прототипируется, тестируется потом по подсистемам реализуется. Тесты переиспользуются при этом...
А компиляция в типичном цикле разработки -- это интимное дело прогера. Я бы понял ещё ошибки, которые выявляются на момент коммита, например, но чем так выделен момент компиляции-то?
P>этот юнит тест будет проверять все места использования типа ??
Это предложение я тоже не понял. Ты пишешь библу. Ну, например, функцию qstable_sort, юнит-тестируешь её, потом она работает в твоём коде...
P>жесть
Ну ты реально часто встречал такие вот классы Age? А для концепта "разница в возрасте" чего делали, например? А для "суммарный возраст работников нашего склада"? А для "средний возраст сотрудника" что делали и как вычисляли?
Что-то мне кажется, что ты стебёшься.
P>
P>int f(int age, int level);// где level - это допустим "уровень" работника по внутренней шкале фирмы, допустим от 1 до 50.
P>
P>ок, это чоткий парень пишет P>
P>assert(IsValidAge( age ));
P>assert(IsValidLevel( level ));
P>
P>ведь он так чёток, правда? не хуже брюса вилиса, ога. P>и далее внутри этой функции нужно вызвать P>
P>int g(int level, int age);
P>
P>при том, что пришли level и age которые допустимые в обоих диапазонах. P>и что? его чёткости хватит на то, чтобы не перепутать местами здесь параметры? P>насколько длинна его чёткость? На сколько его памяти хватит чтобы держать все эти контексты в голове? P>какой бы длинной не была его чёткость, рано или поздно её не хватит
Оставлю весь текст, так как не знаю, что там отрезать. Суть в том, что для того и есть юнит-тесты.
В частности юнит-тест f должен будет вызвать эту функцию со всеми граничными значениями и возраста и уровня...
P>а в чём проблема? (при том, что в примере выше, код проверки range будет общим для age и level)
Проблем много, вообще-то, я там повыше указал, несколько.
Но я другой вопрос задал. ТЫ ВСТРЕЧАЛ ТАКОЕ в продакшине, а не в учебно-методических измышлениях?..
Я вот почти не встречал, например.
P>ога, добавляем разные именна в контекста для слежки чёткого пацана. А что? он же чёткий — всё запомнит, всё проверит.
Обычно нормальные программисты пишут код осознанно...
И потом запускают и проверяют, что оно работает...
E>>Вообще есть такой подход, на входе в функцию -- проверка параметров, на выходе -- проверка результатов... E>>Он намного эффективнее статических типов
P>orly?
Это я тоже не понял.
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, Piko, Вы писали:
P>>>в каких случаях qsort, по твоему мнению, быстрее? E>>Конкретно вот тут ты что имел в виду? Что шарики имеют форму кубиков но в другом метрическом пространстве?
P>я везде не копипастил оговорку — так как надоедает и должно быть очевидно. P>так как не говорил об конкретном компиляторе и реализации, то я думал очевидно, что речь идёт об интерфейсе и одинаковых алгоритмах.
Я не понимаю. Интерфейс и того и того фиксирован. И интерфейс std::sort вынуждает юзать алгоритм склонный вызывать лишние, по сравнению с qsort сравнения, в случае, если в сортируемой последовательности есть повторы...
P>Я всё таки стараюсь уважать сообразительность собеседников и не разжёвывать очевидные вещи
Зря, в результате ты пишешь вообще непонятные вещи.
Мало того, я думаю, что и-за того, что ты так нечётко формулируешь свои мысли, ты и самого себя часто вводишь в заблуждение...
В общем я так и не понял, что ты имел в виду в примере про сортировки. Хотя ты вслед за статьёй ссылался на какие-то замеры производительности, вроде?
В любом случае, попробуй ТОЧНО сформулировать свой тезис. Возможно он не вызовет ни в ком желания спорить
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, Erop, Вы писали:
E>А компиляция в типичном цикле разработки -- это интимное дело прогера. Я бы понял ещё ошибки, которые выявляются на момент коммита, например, но чем так выделен момент компиляции-то?
ну я хз ещё как объяснить, сорри
P>>этот юнит тест будет проверять все места использования типа ?? E>Это предложение я тоже не понял. Ты пишешь библу. Ну, например, функцию qstable_sort, юнит-тестируешь её, потом она работает в твоём коде...
нет, вот у меня есть тип Age, который заботится о сохранении своего инварианта. написав его один раз — я уверен, что в него никогда не придёт никакая хрень — и все его пользователи имеют нормальное значение. как твои юниты тесты смогут дать хотя-бы близкую к этой гарантию??
P>>жесть E>Ну ты реально часто встречал такие вот классы Age? А для концепта "разница в возрасте" чего делали, например? А для "суммарный возраст работников нашего склада"? А для "средний возраст сотрудника" что делали и как вычисляли?
конкретно Age — нет, с erp и т.п. не сталкивался, и не очень хочу.
но подобная концепция используется
E>Что-то мне кажется, что ты стебёшься.
нет
E>Оставлю весь текст, так как не знаю, что там отрезать. Суть в том, что для того и есть юнит-тесты. E>В частности юнит-тест f должен будет вызвать эту функцию со всеми граничными значениями и возраста и уровня...
ну вызвал ты f, ну ок — ну поймал на том что границы разные, ну хорошо.
но вот стоит капельку усложнить пример: диапазоны совпадают, и что теперь??
P>>а в чём проблема? (при том, что в примере выше, код проверки range будет общим для age и level) E>Проблем много, вообще-то, я там повыше указал, несколько. E>Но я другой вопрос задал. ТЫ ВСТРЕЧАЛ ТАКОЕ в продакшине, а не в учебно-методических измышлениях?.. E>Я вот почти не встречал, например.
я встречал, не так часто, как хотелось бы. Но, ценность type-safety от этого ничуть не убавляется
вот тебе нужно на каждый чих писать unit-test, при type-safety всё вообще прозрачно и не требует внимания — бери и используй
P>>ога, добавляем разные именна в контекста для слежки чёткого пацана. А что? он же чёткий — всё запомнит, всё проверит. E>Обычно нормальные программисты пишут код осознанно... E>И потом запускают и проверяют, что оно работает...
ну я же говорю, чёткие поцоны.
E>>>Вообще есть такой подход, на входе в функцию -- проверка параметров, на выходе -- проверка результатов... E>>>Он намного эффективнее статических типов P>>orly? E>Это я тоже не понял.
чем он эффективней?
статический тип один раз пишется — и забыл. параметры на выходе и входе проверять нужно всегда
Здравствуйте, Erop, Вы писали:
P>>>>в каких случаях qsort, по твоему мнению, быстрее? E>>>Конкретно вот тут ты что имел в виду? Что шарики имеют форму кубиков но в другом метрическом пространстве? P>>я везде не копипастил оговорку — так как надоедает и должно быть очевидно. P>>так как не говорил об конкретном компиляторе и реализации, то я думал очевидно, что речь идёт об интерфейсе и одинаковых алгоритмах. E>Я не понимаю. Интерфейс и того и того фиксирован. И интерфейс std::sort вынуждает юзать алгоритм склонный вызывать лишние, по сравнению с qsort сравнения, в случае, если в сортируемой последовательности есть повторы...
точно также как и компаратор qsort должен делать лишнее в случае если на типах определён только предикат сравнения, и компаратор реализован через него
имхо, то что спор идёт не о разнице компараторов, не о возможной разнице реализованных алгоритмов, в этой теме очевидно почти всем.
Здравствуйте, Piko, Вы писали:
P>нет, вот у меня есть тип Age, который заботится о сохранении своего инварианта. написав его один раз — я уверен, что в него никогда не придёт никакая хрень — и все его пользователи имеют нормальное значение. как твои юниты тесты смогут дать хотя-бы близкую к этой гарантию??
1) Тут даже юнит-тесты не нужны. Вполне достаточно ассертов.
P>нет
Ну и какие реальные классы, оборачивающие число, ты встречал? И что там происходило для разности, суммы, среднего и т. д.?
P>ну вызвал ты f, ну ок — ну поймал на том что границы разные, ну хорошо. P>но вот стоит капельку усложнить пример: диапазоны совпадают, и что теперь??
Ну вообще код должен предметно что-то делать. Ты всё равно в систему типов всю семантику не загонишь...
Может быть возраст того и иного сотрудника, например. Они же одного типа будут?
P>я встречал, не так часто, как хотелось бы. Но, ценность type-safety от этого ничуть не убавляется
А зачем тебе этого хочется, если это не прижилось на практике?
P>вот тебе нужно на каждый чих писать unit-test, при type-safety всё вообще прозрачно и не требует внимания — бери и используй
Ну тест всё равно нужно писать, даже с типами. Или у вас ответственность программиста заканчивается, как только он смог собрать свой код? Даже типа и запускабельности не требуете?
E>>Обычно нормальные программисты пишут код осознанно... E>>И потом запускают и проверяют, что оно работает...
P>ну я же говорю, чёткие поцоны.
Либо у тебя нет опыта разработки в команде, либо ты меня троллишь.
Опиши, как по твоему выглядит процесс разработки?
P>чем он эффективней?
Ну, как минимум функции самодокумментируются
P>статический тип один раз пишется — и забыл. параметры на выходе и входе проверять нужно всегда
Так их нужно вне зависимости от типов. Или ты надеешься написать систему типов, которая предусмотрит предусловия всех разработанных в последствии функций?
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
P>имхо, то что спор идёт не о разнице компараторов, не о возможной разнице реализованных алгоритмов, в этой теме очевидно почти всем.
Речь идёт о сравнении двух подходов к кодированию. Типа С-стиль против С++-стиля. Не?
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, Erop, Вы писали:
P>>имхо, то что спор идёт не о разнице компараторов, не о возможной разнице реализованных алгоритмов, в этой теме очевидно почти всем. E>Речь идёт о сравнении двух подходов к кодированию. Типа С-стиль против С++-стиля. Не?
я правильно тебя понимаю, что в твоём понимании tristate компаратор для сортировки — это C-style, а two-state less/предикат — это C++style? и сначала всей дискуссии ты обсуждаешь именно это?
Здравствуйте, Erop, Вы писали:
P>>нет, вот у меня есть тип Age, который заботится о сохранении своего инварианта. написав его один раз — я уверен, что в него никогда не придёт никакая хрень — и все его пользователи имеют нормальное значение. как твои юниты тесты смогут дать хотя-бы близкую к этой гарантию?? E>1) Тут даже юнит-тесты не нужны. Вполне достаточно ассертов.
и где гарантия что assert не забудут вставить везде? можешь не отвечать, я знаю ответ...
в случае с типом — такая гарантия есть и заметь, телодвижений нужно меньше делать
P>>ну вызвал ты f, ну ок — ну поймал на том что границы разные, ну хорошо. P>>но вот стоит капельку усложнить пример: диапазоны совпадают, и что теперь?? E>Ну вообще код должен предметно что-то делать. Ты всё равно в систему типов всю семантику не загонишь...
не спорю, я этого и не говорил
но, получается возложить большую часть той возни которую ты предлагаешь делать юнит тестами
E>Может быть возраст того и иного сотрудника, например. Они же одного типа будут?
да. одного
P>>я встречал, не так часто, как хотелось бы. Но, ценность type-safety от этого ничуть не убавляется E>А зачем тебе этого хочется, если это не прижилось на практике?
ну знаешь, я naked new/delete встречал на практике больше чем хотелось бы, и что из этого??
P>>вот тебе нужно на каждый чих писать unit-test, при type-safety всё вообще прозрачно и не требует внимания — бери и используй E>Ну тест всё равно нужно писать, даже с типами. Или у вас ответственность программиста заканчивается, как только он смог собрать свой код? Даже типа и запускабельности не требуете?
конечно нужно писать, но не на всякую мелочь
P>>чем он эффективней? E>Ну, как минимум функции самодокумментируются
а чем
Salary DoSomething(Age);
не документирована?
имхо, даже лучше чем тестами, так как видно на месте всё
P>>статический тип один раз пишется — и забыл. параметры на выходе и входе проверять нужно всегда E>Так их нужно вне зависимости от типов.
не спорю, но так как многих мелких ошибок быть не может в принципе, можно спокойно подниматься на более высокий уровень, и делать unit-тесты именно там
либо вообще не unit-тесты, а просто полностью внешние real-case тесты
E>Или ты надеешься написать систему типов, которая предусмотрит предусловия всех разработанных в последствии функций?
Здравствуйте, Alexey Sudachen, Вы писали:
CC>>Передача по значению вместо ссылки, введён совершенно бесполезный класс Y. Мда... AS>Да именно так. Предполагалось что читающий таки умеет думать и чуток знает язык, а не только способен внимательно читать )))
Ты в качестве примера написал говнокод. Объясни внятно — зачем?
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
Здравствуйте, Erop, Вы писали:
E>Речь идёт о сравнении двух подходов к кодированию. Типа С-стиль против С++-стиля. Не?
использование less компаратора вместо 3-state в STL не означает что только так и никак иначе следует писать на С++.
Я когда то избавился от STL в своих проектах, написав свои аналоги. Сортировки в том числе.
Так, интересу ради вот тебе выдержка из regression tests:
sort3 это вариант сортера, который принимает 3-state предикат.
выглядит это примерно так:
template<class Iter, class LessComparator> void sort (Iter first, Iter last, LessComparator LCmp)
{
Sort::Main (first, last, last - first, [LCmp] (decltype(*first) a, decltype(*last) b) {return (LCmp (a, b)) ? -1 : (LCmp (b, a) ? 1 : 0);}, LCmp);
}
template<class Iter> void sort (Iter first, Iter last)
{
Sort::Main (first, last, last - first,
[] (decltype(*first) a, decltype(*last) b) {return (a < b) ? -1 : ((b < a) ? 1 : 0);},
[] (decltype(*first) a, decltype(*last) b) {return (a < b);}
);
}
template<class Iter, class Comparator> void sort3 (Iter first, Iter last, Comparator Cmp)
{
Sort::Main (first, last, last - first, Cmp, [Cmp] (decltype(*first) a, decltype(*last) b) {return (Cmp (a, b) < 0);});
}
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
Не понятно, какой диапазон возрастов допускает DoSomething
P>имхо, даже лучше чем тестами, так как видно на месте всё
Я. вообще-то, говорил про assert'ы
P>не спорю, но так как многих мелких ошибок быть не может в принципе, можно спокойно подниматься на более высокий уровень, и делать unit-тесты именно там
Это иллюзия. В реале для DoXXX, в зависимости от того, что скрывается за XXX, нужны разные ограничения.
Ну например, если ХХХ = "получить пенсию", то можно проверить, что возраст подходящий либо есть иное основание для пенсии.
E>>Или ты надеешься написать систему типов, которая предусмотрит предусловия всех разработанных в последствии функций?
P>я этого не говорил
Ну значит предусловия на входе в функции всё равно надо проверять, а тогда не понятно на кой возиться с выделением ввозраста в отдельный тип.
И ты так и не ответил про производные типы. Разность взрастов, сумму, средний и т. д...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
P>>не документирована? E>Не понятно, какой диапазон возрастов допускает DoSomething
конкретно здесь — любой валидный возраст
P>>имхо, даже лучше чем тестами, так как видно на месте всё E>Я. вообще-то, говорил про assert'ы
ты assert'ы в интерфейсы выносишь? или каждый раз в код вызываемой функции смотришь?
P>>не спорю, но так как многих мелких ошибок быть не может в принципе, можно спокойно подниматься на более высокий уровень, и делать unit-тесты именно там E>Это иллюзия. В реале для DoXXX, в зависимости от того, что скрывается за XXX, нужны разные ограничения. E>Ну например, если ХХХ = "получить пенсию", то можно проверить, что возраст подходящий либо есть иное основание для пенсии.
ок, допустим в этом случае — пусть не будем вводить новый тип для пенсионеров, но всё равно уже одной проверкой на верхнюю границу меньше — разве плохо?
E>>>Или ты надеешься написать систему типов, которая предусмотрит предусловия всех разработанных в последствии функций? P>>я этого не говорил E>Ну значит предусловия на входе в функции всё равно надо проверять
если типов недостаточно — то надо
допустим когда проверка параметров зависит от двух параметров — можно и ввести проверку — не проблема. но, проверка получается меньше
E>а тогда не понятно на кой возиться с выделением ввозраста в отдельный тип.
чтобы уменьшить возню с assert.
E>И ты так и не ответил про производные типы. Разность взрастов, сумму, средний и т. д...
ок, только ты ответь сначала, что означает сумма возрастов семантически?
Здравствуйте, Piko, Вы писали:
P>ок, допустим в этом случае — пусть не будем вводить новый тип для пенсионеров, но всё равно уже одной проверкой на верхнюю границу меньше — разве плохо?
Конечно плохо, так как проверки размазаны по коду не понятно где их искать и как их менять, если вдруг понадобится...
P>если типов недостаточно — то надо
То есть ты таки надешься? E>>>>Или ты надеешься написать систему типов, которая предусмотрит предусловия всех разработанных в последствии функций?
P>допустим когда проверка параметров зависит от двух параметров — можно и ввести проверку — не проблема. но, проверка получается меньше E>>а тогда не понятно на кой возиться с выделением ввозраста в отдельный тип. P>чтобы уменьшить возню с assert.
Это если ты считаешь, что assert -- это "возня", хотя на самом деле это один из способов самотестирования и самодокументирования программы.
Система типов хороша, когда она гарантирует бинарную корректность данных, так так тогда сильно упрощается анализ поведения программы. А всякая ерунда, вроде "числа месяца" это типа IntRange<1, 31>::Type, а числа года IntRange<1, 365>::Type, но в високосном IntRange<1, 366>::Type -- это от лукавого...
E>>И ты так и не ответил про производные типы. Разность взрастов, сумму, средний и т. д... P>ок, только ты ответь сначала, что означает сумма возрастов семантически?
Это то, что делятна число людей, что бы узнать их средний возраст, например...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, Erop, Вы писали:
P>>ок, допустим в этом случае — пусть не будем вводить новый тип для пенсионеров, но всё равно уже одной проверкой на верхнюю границу меньше — разве плохо? E>Конечно плохо, так как проверки размазаны по коду не понятно где их искать и как их менять, если вдруг понадобится...
что понадобится?
Тип Age заботится о том, чтобы возраст был допустимым
P>>если типов недостаточно — то надо E>То есть ты таки надешься? E>>>>>Или ты надеешься написать систему типов, которая предусмотрит предусловия всех разработанных в последствии функций?
P>>допустим когда проверка параметров зависит от двух параметров — можно и ввести проверку — не проблема. но, проверка получается меньше E>>>а тогда не понятно на кой возиться с выделением ввозраста в отдельный тип. P>>чтобы уменьшить возню с assert. E>Это если ты считаешь, что assert -- это "возня", хотя на самом деле это один из способов самотестирования и самодокументирования программы.
ну так если типы намного проще в использовании и документировании
E>Система типов хороша, когда она гарантирует бинарную корректность данных, так так тогда сильно упрощается анализ поведения программы.
E>А всякая ерунда, вроде "числа месяца" это типа IntRange<1, 31>::Type, а числа года IntRange<1, 365>::Type, но в високосном IntRange<1, 366>::Type -- это от лукавого...
А в чём проблема? Может для числа месяца это избыточно, отчасти потому, что само по себе редко используется.
Но сделать нормальный класс Date с инвариантами — намного легче чем сувать везде assert(IsValidDate(x))
E>>>И ты так и не ответил про производные типы. Разность взрастов, сумму, средний и т. д... P>>ок, только ты ответь сначала, что означает сумма возрастов семантически? E>Это то, что делятна число людей, что бы узнать их средний возраст, например...
я это и хотел услышать, то есть сумма сама по себе не нужна, а нужно усреднение, так?
Здравствуйте, Piko, Вы писали:
P>что понадобится?х P>Тип Age заботится о том, чтобы возраст был допустимым
Можешь выразить это "допустимым" конкретнее? С чего ты вообще взял, что для разных дел допустимый возраст один и тот же?
P>>>если типов недостаточно — то надо E>>То есть ты таки надешься? E>>>>>>Или ты надеешься написать систему типов, которая предусмотрит предусловия всех разработанных в последствии функций?
P>ну так если типы намного проще в использовании и документировании
Давай, покажи нам на примере возраста
P>я это и хотел услышать, то есть сумма сама по себе не нужна, а нужно усреднение, так?
нет не так. Ещё дисперсия бывает, или скидка молодой семье, суммарный возраст которой меньше 45 лет
И разность возрастов не забывай пожалуйста
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, Erop, Вы писали:
P>>что понадобится?х P>>Тип Age заботится о том, чтобы возраст был допустимым E>Можешь выразить это "допустимым" конкретнее? С чего ты вообще взял, что для разных дел допустимый возраст один и тот же?
Тип Age отвечает вообще за возраст. Допустим от 0 до 200 (ну мало ли, главное слишком большой не допустить).
А дальше, можно делать либо более требовательные типы, либо проверку внутри (если проверка одноразовая). Не вижу никаких проблем.
и при этом, внутри, возюканья в любом случае меньше. допустим подходят только старше 20 — не вопрос, просто проверка на >20, проверку на верхнюю границу делать не надо
P>>>>если типов недостаточно — то надо E>>>То есть ты таки надешься? E>>>>>>>Или ты надеешься написать систему типов, которая предусмотрит предусловия всех разработанных в последствии функций? P>>ну так если типы намного проще в использовании и документировании E>Давай, покажи нам на примере возраста
я уже показал
Salary getEstimaedSalary(Age);
Принимает возраст, возвращает зарплату
а что у тебя что
int getEstimaedSalary(int);
?
и ассерты внутри??
P>>я это и хотел услышать, то есть сумма сама по себе не нужна, а нужно усреднение, так? E>нет не так. Ещё дисперсия бывает, или скидка молодой семье, суммарный возраст которой меньше 45 лет
ну и считай — в чём проблема-то? вроде умеешь
E>И разность возрастов не забывай пожалуйста
Здравствуйте, Piko, Вы писали:
P>Тип Age отвечает вообще за возраст. Допустим от 0 до 200 (ну мало ли, главное слишком большой не допустить). P>А дальше, можно делать либо более требовательные типы, либо проверку внутри (если проверка одноразовая). Не вижу никаких проблем.
А я вот вижу проблемы. Мафусуил, например, прожил 997 лет, что ли, а Адам 600 с чем-то, а число 200 ты взял с потолка, нагородил вокруг целый тип, и навёл кучу тени на плетень... Заметь, на пустом месте.
Абстракции они того, трудно делаются, особенно если ты хочешь их из пальца высасывать и при этом ещё и не ошибаться
P>и при этом, внутри, возюканья в любом случае меньше. допустим подходят только старше 20 — не вопрос, просто проверка на >20, проверку на верхнюю границу делать не надо
А зачем вообще делать проверку на верхнюю, если она не нужна?
А если уж нужна, то что хорошего в том, что одна проверка записана в функции, а другая где-то в недрах возраста?
E>>Давай, покажи нам на примере возраста
P>я уже показал
Пока показал лишь то, что ты некомпатибл с Библией...
P>
P>Salary getEstimaedSalary(Age);
P>
P>Принимает возраст, возвращает зарплату P>а что у тебя что P>
P>int getEstimaedSalary(int);
P>
P>? P>и ассерты внутри??
В С/С++ принято давать понятные имена параметрам функций, как и самим функциям
money getEstimaedSalary(int age)
P>>>я это и хотел услышать, то есть сумма сама по себе не нужна, а нужно усреднение, так? E>>нет не так. Ещё дисперсия бывает, или скидка молодой семье, суммарный возраст которой меньше 45 лет
P>ну и считай — в чём проблема-то? вроде умеешь
тип какой у всех этих выражений будет?
E>>И разность возрастов не забывай пожалуйста
P>ага, ещё умножение до-кучи — возраст в квадрате
возраст в квадрате концепт небанальный, хотя в какой-нибудь медицинский индекс запросто может входить, а вот на сколько Петя старше своей жены Маши вопрос весьма жизненный
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, Erop, Вы писали:
P>>Тип Age отвечает вообще за возраст. Допустим от 0 до 200 (ну мало ли, главное слишком большой не допустить). P>>А дальше, можно делать либо более требовательные типы, либо проверку внутри (если проверка одноразовая). Не вижу никаких проблем. E>А я вот вижу проблемы. Мафусуил, например, прожил 997 лет, что ли, а Адам 600 с чем-то, а число 200 ты взял с потолка, нагородил вокруг целый тип, и навёл кучу тени на плетень... Заметь, на пустом месте. E>Абстракции они того, трудно делаются, особенно если ты хочешь их из пальца высасывать и при этом ещё и не ошибаться
шутник
я думал мы об range ограничении говорим.
P>>и при этом, внутри, возюканья в любом случае меньше. допустим подходят только старше 20 — не вопрос, просто проверка на >20, проверку на верхнюю границу делать не надо E>А зачем вообще делать проверку на верхнюю, если она не нужна?
это был пример, зачем лезть в бутылку?
E>А если уж нужна, то что хорошего в том, что одна проверка записана в функции, а другая где-то в недрах возраста?
функция принимает возраст.
если у функции могут быть дополнительные требования к возрасту, если это требование нужно один раз — можно проверять внутри
E>>>Давай, покажи нам на примере возраста P>>я уже показал E>Пока показал лишь то, что ты некомпатибл с Библией...
сказками не интересуюсь
P>>
P>>Salary getEstimaedSalary(Age);
P>>
P>>Принимает возраст, возвращает зарплату P>>а что у тебя что P>>
P>>int getEstimaedSalary(int);
P>>
P>>? P>>и ассерты внутри?? E>В С/С++ принято давать понятные имена параметрам функций, как и самим функциям E>
money getEstimaedSalary(int age)
ох ты какой чёткий, даже возвращаемому параметру имя дал
или это таки тип?
P>>>>я это и хотел услышать, то есть сумма сама по себе не нужна, а нужно усреднение, так? E>>>нет не так. Ещё дисперсия бывает, или скидка молодой семье, суммарный возраст которой меньше 45 лет P>>ну и считай — в чём проблема-то? вроде умеешь E>тип какой у всех этих выражений будет?
какой хочешь — хочешь целое, хочешь Age E>>>И разность возрастов не забывай пожалуйста P>>ага, ещё умножение до-кучи — возраст в квадрате E>возраст в квадрате концепт небанальный, хотя в какой-нибудь медицинский индекс запросто может входить, а вот на сколько Петя старше своей жены Маши вопрос весьма жизненный
да, я понимаю, что требования можно вводить и убирать во время дискуссии, поэтому всё это пустой трёп.
Здравствуйте, Piko, Вы писали:
P>шутник P>я думал мы об range ограничении говорим.
Я вообще плохо понимаю, как ты собираешься выбрать адекватные границы для "возраста вообще"? А для какой-то конкретной ситуации?
Вот возраст -- хороший очень пример. Т сам его предложил, наверное он адекватен твоей идее.
Я бы для возраста юзал бы int не парился, а в функциях писал бы asserts, да и всё.
Но у тебя какой-то иной подход. Я так понял, что ты хочешь что-то автоматизировать, что бы не страдать "вознёй с assert'ами". Ну покажи же, как автоматизировать-то будем? Вот на примере возраста покажи.
P>>>и при этом, внутри, возюканья в любом случае меньше. допустим подходят только старше 20 — не вопрос, просто проверка на >20, проверку на верхнюю границу делать не надо E>>А зачем вообще делать проверку на верхнюю, если она не нужна?
P>это был пример, зачем лезть в бутылку?
Про бутылку я тоже не понял. Прводи понятные актуальные примеры.
А то я вижу такой сценарий, что мы в какой-то функции посмотрели, что возраст гарантирует, что он до 100 ну и заложились на этот факт, а ассерт не написали. Потом кто-то где-то найдёт, что возраст бывает и 123, ну подправит класс Age. Думаешь он проверит, что там у нас в функции написано, или, хотя бы, потестирует её?
P>функция принимает возраст. P>если у функции могут быть дополнительные требования к возрасту, если это требование нужно один раз — можно проверять внутри
Как в этом сценарии будет выявлена ошибка?
P>>>и ассерты внутри?? E>>В С/С++ принято давать понятные имена параметрам функций, как и самим функциям E>>
money getEstimaedSalary(int age)
P>ох ты какой чёткий, даже возвращаемому параметру имя дал P>или это таки тип?
Это тип, или псевдоним типа. так как в каком типе хранить суммы денег -- вопрос очень непростой. Но тут проблема именно с бинарным представлением, а не с логикой программы. Если это поделка на коленке для домашней бухгалтерии, то можно так:
typedef double money;
Но лучше, конечно же, 64-битное с фиксированной десятичной точкой.
P>какой хочешь — хочешь целое, хочешь Age
Я вообще считаю, что Age -- лишнй, что он не нужен и что все Age надо заменить на int.
Но ты отстаиваешь иной взгляд. Так какой тип, по твоему должны иметь:
Age + Age
Age + int
Age — Age // пусть этот тип имеет псевдонм age_diff
Age + age_diff
Age + int // если это не то же, что и выше
Age / Age
Age * 0.5
P>да, я понимаю, что требования можно вводить и убирать во время дискуссии, поэтому всё это пустой трёп.
IMHO, это принципиальна проблема подхода, когда для яблок используются одни натуральные числа, а для морковок -- другие...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, Erop, Вы писали:
P>>шутник P>>я думал мы об range ограничении говорим. E>Я вообще плохо понимаю, как ты собираешься выбрать адекватные границы для "возраста вообще"? А для какой-то конкретной ситуации?
адекватный границы, это когда всякий хлам типа 1001230 не пройдёт.
ну конечно если тебя интересуют говно мамонта то ...
E>Вот возраст -- хороший очень пример. Т сам его предложил, наверное он адекватен твоей идее. E>Я бы для возраста юзал бы int не парился, а в функциях писал бы asserts, да и всё.
одинаковые asserts? или разные?
ты же сам писал:
assert( IsValidAge( age ) );
а теперь сам же говоришь, что требования другие.
ок, зачем всё время писать IsValidAge( age ), если Age сам может позаботится.
E>Но у тебя какой-то иной подход. Я так понял, что ты хочешь что-то автоматизировать, что бы не страдать "вознёй с assert'ами". Ну покажи же, как автоматизировать-то будем? Вот на примере возраста покажи.
я хз, вроде понятно объяснил всё
E>А то я вижу такой сценарий, что мы в какой-то функции посмотрели, что возраст гарантирует, что он до 100 ну и заложились на этот факт, а ассерт не написали. Потом кто-то где-то найдёт, что возраст бывает и 123, ну подправит класс Age. Думаешь он проверит, что там у нас в функции написано, или, хотя бы, потестирует её?
а твой IsValidAge что делает???
P>>функция принимает возраст. P>>если у функции могут быть дополнительные требования к возрасту, если это требование нужно один раз — можно проверять внутри E>Как в этом сценарии будет выявлена ошибка?
какая именно? exception, etc, меню богатое
P>>>>и ассерты внутри?? E>>>В С/С++ принято давать понятные имена параметрам функций, как и самим функциям E>>>
money getEstimaedSalary(int age)
P>>ох ты какой чёткий, даже возвращаемому параметру имя дал P>>или это таки тип?
E>Это тип, или псевдоним типа. так как в каком типе хранить суммы денег -- вопрос очень непростой. Но тут проблема именно с бинарным представлением, а не с логикой программы. Если это поделка на коленке для домашней бухгалтерии, то можно так:
typedef double money;
E>Но лучше, конечно же, 64-битное с фиксированной десятичной точкой.
а лучше нормальный класс
P>>какой хочешь — хочешь целое, хочешь Age E>Я вообще считаю, что Age -- лишнй, что он не нужен и что все Age надо заменить на int. E>Но ты отстаиваешь иной взгляд. Так какой тип, по твоему должны иметь:
E>Age + Age E>Age + int E>Age — Age // пусть этот тип имеет псевдонм age_diff E>Age + age_diff E>Age + int // если это не то же, что и выше E>Age / Age E>Age * 0.5
ну и?
делаешь шаблон/макрос для всех этих операций: нужен новый тип с определённым операций, просто делаешь trairs, tag, и всё..
P>>да, я понимаю, что требования можно вводить и убирать во время дискуссии, поэтому всё это пустой трёп. E>IMHO, это принципиальна проблема подхода, когда для яблок используются одни натуральные числа, а для морковок -- другие...
кэп мод: как бы от задачи зависит.
есть задачи где складывать колличество морковок и яблок, не нужно, и лишь является ошибкой — почему бы не обезапасить себя системой типов от ошибок?
Здравствуйте, Piko, Вы писали:
E>>Я вообще плохо понимаю, как ты собираешься выбрать адекватные границы для "возраста вообще"?
P>адекватный границы, это когда всякий хлам типа 1001230 не пройдёт.
Ты конкретный код покажи.
P>одинаковые asserts? или разные?
Осмысленные. Каждый раз смотрим, чего для функции надо, и пишем такой assert...
P>ок, зачем всё время писать IsValidAge( age ), если Age сам может позаботится.
А не надо всё время, надо там где надо, а там где не надо, не писать...
P>я хз, вроде понятно объяснил всё
Пока что никакой конкретики вообще...
E>>А то я вижу такой сценарий, что мы в какой-то функции посмотрели, что возраст гарантирует, что он до 100 ну и заложились на этот факт, а ассерт не написали. Потом кто-то где-то найдёт, что возраст бывает и 123, ну подправит класс Age. Думаешь он проверит, что там у нас в функции написано, или, хотя бы, потестирует её?
P>а твой IsValidAge что делает???
Я не знаю, что он делает. Его же ты придумал
Но в той функции, где мы закладываемся на 100, так и напишем "возраст меньше 100" и всё.
P>какая именно? exception, etc, меню богатое
Я имею в виду не технический, а административный аспект. Вот поддержали мы в новой версии возрастА больше 100 лет. Как нам выявить все возникшие ошибки? Какой АДМИНИСТРАТИВНОЙ процедурой?
P>а лучше нормальный класс
Что такое "нормальный класс"?
E>>Age + Age E>>Age + int E>>Age — Age // пусть этот тип имеет псевдонм age_diff E>>Age + age_diff E>>Age + int // если это не то же, что и выше E>>Age / Age E>>Age * 0.5
P>делаешь шаблон/макрос для всех этих операций: нужен новый тип с определённым операций, просто делаешь trairs, tag, и всё..
Какой должен быть? Ты вопрос понимаешь? Напиши в каждой строчке этой таблицы тип...
P>кэп мод: как бы от задачи зависит.
Как бы наличие трудности от задачи не зависит...
От задачи может зависеть, выгодно ли с этой трудностью мириться...
P>есть задачи где складывать колличество морковок и яблок, не нужно, и лишь является ошибкой — почему бы не обезапасить себя системой типов от ошибок?
Потому, что это дорого, сложно и чревато другими ошибками...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, Erop, Вы писали:
E>>>Я вообще плохо понимаю, как ты собираешься выбрать адекватные границы для "возраста вообще"? P>>адекватный границы, это когда всякий хлам типа 1001230 не пройдёт. E>Ты конкретный код покажи.
код чего? класса с инвариантами?
P>>одинаковые asserts? или разные? E>Осмысленные. Каждый раз смотрим, чего для функции надо, и пишем такой assert...
ну вот у тебя 20 функций к одному параметру одинаковое требование. будешь копипастить?
P>>ок, зачем всё время писать IsValidAge( age ), если Age сам может позаботится. E>А не надо всё время, надо там где надо, а там где не надо, не писать...
ну вот надо допустим в 20 местах, и чё?
P>>я хз, вроде понятно объяснил всё E>Пока что никакой конкретики вообще...
ну печально
E>>>А то я вижу такой сценарий, что мы в какой-то функции посмотрели, что возраст гарантирует, что он до 100 ну и заложились на этот факт, а ассерт не написали. Потом кто-то где-то найдёт, что возраст бывает и 123, ну подправит класс Age. Думаешь он проверит, что там у нас в функции написано, или, хотя бы, потестирует её? P>>а твой IsValidAge что делает??? E>Я не знаю, что он делает. Его же ты придумал
В С, как и в "С++ для не слишком умных" можно просто написать
int IsValidAge( int );
и потом писать везде на входе в функции
assert( IsValidAge( age ) );
P>>какая именно? exception, etc, меню богатое E>Я имею в виду не технический, а административный аспект. Вот поддержали мы в новой версии возрастА больше 100 лет. Как нам выявить все возникшие ошибки? Какой АДМИНИСТРАТИВНОЙ процедурой?
в смысле изменили требование внутри класса?
если кому-то из старых пользователей это требование не подойдёт — то придётся изменять. точно также как в твоём случае с
assert( IsValidAge( age ) );
E>>>Но лучше, конечно же, 64-битное с фиксированной десятичной точкой. P>>а лучше нормальный класс E>Что такое "нормальный класс"?
у тебя в C, есть встроенный тип "64-битное с фиксированной десятичной точкой"?
да так чтобы ничего не сломалось при изменении представления??
E>>>Age + Age E>>>Age + int E>>>Age — Age // пусть этот тип имеет псевдонм age_diff E>>>Age + age_diff E>>>Age + int // если это не то же, что и выше E>>>Age / Age E>>>Age * 0.5 P>>делаешь шаблон/макрос для всех этих операций: нужен новый тип с определённым операций, просто делаешь trairs, tag, и всё.. E>Какой должен быть? Ты вопрос понимаешь? Напиши в каждой строчке этой таблицы тип...
в смысле тип результата, или чего? я не телепат
P>>кэп мод: как бы от задачи зависит. E>Как бы наличие трудности от задачи не зависит... E>От задачи может зависеть, выгодно ли с этой трудностью мириться...
ага, с assert'ами труднее
P>>есть задачи где складывать колличество морковок и яблок, не нужно, и лишь является ошибкой — почему бы не обезапасить себя системой типов от ошибок? E>Потому, что это дорого, сложно и чревато другими ошибками...
Здравствуйте, Piko, Вы писали:
P>код чего? класса с инвариантами?
типа Age, что бы за этим выражением ты не скрывал...
E>>Осмысленные. Каждый раз смотрим, чего для функции надо, и пишем такой assert... P>ну вот у тебя 20 функций к одному параметру одинаковое требование. будешь копипастить?
Это совпадение или какой-то математический факт? Если первое, то напишу все 20 независимо, если второе -- то введу функцию, проверки этого факта. Но тоже не всегда. Скажем > 0 буду писать везде независимо...
P>ну вот надо допустим в 20 местах, и чё?
И надо во всех посмотреть и решить, что тут вот надо, а тут вот не надо, а тут надо, но другое условие...
типа работа программиста такая -- писать код функций.
E>>Я не знаю, что он делает. Его же ты придумал
P>
P>В С, как и в "С++ для не слишком умных" можно просто написать
P>int IsValidAge( int );
P>и потом писать везде на входе в функции
P>assert( IsValidAge( age ) );
Так задача же не ясна. В некоторых может и бывает валидный и невалидный возраст...
Но если мы о класса Age "общего назначения", то тут с валидным и невалидным возрастом сложнее определиться...
Я пока что так и не понял, о чём конкретно ты говоришь.
P>в смысле изменили требование внутри класса? P>если кому-то из старых пользователей это требование не подойдёт — то придётся
Так и как кто-то узнает, что ту, ту и вон ту функции надо переписать?
P>у тебя в C, есть встроенный тип "64-битное с фиксированной десятичной точкой"?
Есть, это "число центов"...
P>да так чтобы ничего не сломалось при изменении представления??
E>>>>Age + Age E>>>>Age + int E>>>>Age — Age // пусть этот тип имеет псевдонм age_diff E>>>>Age + age_diff E>>>>Age + int // если это не то же, что и выше E>>>>Age / Age E>>>>Age * 0.5 P>>>делаешь шаблон/макрос для всех этих операций: нужен новый тип с определённым операций, просто делаешь trairs, tag, и всё.. E>>Какой должен быть? Ты вопрос понимаешь? Напиши в каждой строчке этой таблицы тип...
P>в смысле тип результата, или чего? я не телепат
Да результата.
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, Erop, Вы писали:
P>>код чего? класса с инвариантами? E>типа Age, что бы за этим выражением ты не скрывал...
его реализация зависит от условий задачи. от того будут ли в проекте похожие типы, и т.п.
E>>>Осмысленные. Каждый раз смотрим, чего для функции надо, и пишем такой assert... P>>ну вот у тебя 20 функций к одному параметру одинаковое требование. будешь копипастить? E>Это совпадение или какой-то математический факт? Если первое, то напишу все 20 независимо, если второе -- то введу функцию, проверки этого факта. Но тоже не всегда. Скажем > 0 буду писать везде независимо...
ох как ты вертишься, как уж на сковородке.
да, математический факт — у 20 функций одинаковые условия.
P>>ну вот надо допустим в 20 местах, и чё? E>И надо во всех посмотреть и решить, что тут вот надо, а тут вот не надо, а тут надо, но другое условие... E>типа работа программиста такая -- писать код функций.
ога. как ещё оправдаешь копипасту?
E>Так задача же не ясна. В некоторых может и бывает валидный и невалидный возраст... E>Но если мы о класса Age "общего назначения", то тут с валидным и невалидным возрастом сложнее определиться... E>Я пока что так и не понял, о чём конкретно ты говоришь.
вот например, параметром функции является возраст, в случае с С, в каждой функции принимающей возраст нужно делать проверку. В случае C++ будет просто класс Age, и внутри функции не о чём не нужно парится. (можно даже использовать различные трюки, чтобы ловить конструкцию Age с неправильным возрастом compile time, но не об этом речь). И как тут поможет статический анализатор кода??
у меня в голове было конкретное Т.З. на проект, где этот тип будет применяться, со всеми требованиями?
Что вообще за бред, коллега?
А главное, как тебе тут поможет статический анализатор кода???
P>>в смысле изменили требование внутри класса? P>>если кому-то из старых пользователей это требование не подойдёт — то придётся E>Так и как кто-то узнает, что ту, ту и вон ту функции надо переписать?
я тебя понял. ты даже знаешь что, можешь функции не использовать, точнее только одну, и в неё копипастить весь код. а то вдруг мы поменяем реализацию функции makeTea с готовки чая, на запуск ядерной бомбы
брееед
P>>у тебя в C, есть встроенный тип "64-битное с фиксированной десятичной точкой"? E>Есть, это "число центов"...
ога, как ты там говоришь, поменяем ограничение? сегодня это число центов, завтра сотые доли центов. И что, менять весь код?
P>>>>делаешь шаблон/макрос для всех этих операций: нужен новый тип с определённым операций, просто делаешь trairs, tag, и всё.. E>>>Какой должен быть? Ты вопрос понимаешь? Напиши в каждой строчке этой таблицы тип... P>>в смысле тип результата, или чего? я не телепат E>Да результата.
зависит от задачи
например:
Age + Age — недоступная операция, Age
Age + int — недоступная операция, Age,
Age — Age — недоступная операция, AgeDiff, Age
Age + age_diff — недоступная операция, Age
Age / Age — недоступная операция, floating point
Age * 0.5 — недоступная операция, Age
Age + int
Age + int // если это не то же, что и выше
сорри, на курсы телепата ещё не пошёл, и пока не собираюсь
Здравствуйте, Piko, Вы писали:
E>>типа Age, что бы за этим выражением ты не скрывал...
P>его реализация зависит от условий задачи. от того будут ли в проекте похожие типы, и т.п.
Блин!
ох как ты вертишься, как уж на сковородке.[-q]Конкретика какая-нибудь будет?
P>да, математический факт — у 20 функций одинаковые условия.
Пример мат. факта -- три числа могут быть сторонами прямоугольного треугольника. А если у меня в программе 100500 функций и аргумент 20 из них не должен превышать 65, то это случайное совпадение просто...
P>ога. как ещё оправдаешь копипасту?
За копи-пасту -- штраф. Писать всегда надо с чистого листа.
Вообще, если у тебя есть семейство функций, с одинаковыми условиями вызова, например семейство аллокаторов, то решать проблему того, что всем надо дать одни и те же параметры, надо архитектурно. Должен быть промежуточный слой, который гарантирует корректность вызова
P>у меня в голове было конкретное Т.З. на проект, где этот тип будет применяться, со всеми требованиями?
Я тебя вообще плохо понимаю. Я так подозреваю, что класс Age какой-то простой довольно, может ты его приведёшь, хотя бы на псевдокоде?
P>А главное, как тебе тут поможет статический анализатор кода???
Он поможет от другого. От того, что передают бинарно несовместимые данные.
P>брееед
Что конкретно бред? То, что взятую с потолка верхнюю границу возраста придётся пододвинуть?
P>ога, как ты там говоришь, поменяем ограничение? сегодня это число центов, завтра сотые доли центов. И что, менять весь код?
Нет, одну константу...
P>например:
P>Age + Age — недоступная операция, Age
а как быть с верхней границей?..
P>Age + int — недоступная операция, Age,
Это логично, если int -- разница возрастов, иначе не понятно
P>Age — Age — недоступная операция, AgeDiff, Age
чем AgeDiff отличается от int? Может ли Age быть отрицательным?
P>Age + age_diff — недоступная операция, Age
P>Age / Age — недоступная операция, floating point
P>Age * 0.5 — недоступная операция, Age
P>[q]
P>Age + int
P>Age + age_diff// если это не то же, что и выше
P>сорри, на курсы телепата ещё не пошёл, и пока не собираюсь
а что значит "недоступная операция"?
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, Erop, Вы писали:
E>>>типа Age, что бы за этим выражением ты не скрывал... P>>его реализация зависит от условий задачи. от того будут ли в проекте похожие типы, и т.п. E>Блин!
ох как ты вертишься, как уж на сковородке.
Конкретика какая-нибудь будет?
надо чётко поставить задачу, не хочу тратить время впустую
P>>да, математический факт — у 20 функций одинаковые условия. E>Пример мат. факта -- три числа могут быть сторонами прямоугольного треугольника. А если у меня в программе 100500 функций и аргумент 20 из них не должен превышать 65, то это случайное совпадение просто...
охх...
P>>ога. как ещё оправдаешь копипасту? E>За копи-пасту -- штраф. Писать всегда надо с чистого листа.
чего, чего?
E>Вообще, если у тебя есть семейство функций, с одинаковыми условиями вызова, например семейство аллокаторов, то решать проблему того, что всем надо дать одни и те же параметры, надо архитектурно. Должен быть промежуточный слой, который гарантирует корректность вызова
ээ, а чем специальный тип параметра не промежуточный слой?
P>>у меня в голове было конкретное Т.З. на проект, где этот тип будет применяться, со всеми требованиями? E>Я тебя вообще плохо понимаю. Я так подозреваю, что класс Age какой-то простой довольно, может ты его приведёшь, хотя бы на псевдокоде?
для разных ситуаций могут быть разные реализации. я могу привести один пример, на что ты скажешь что там нет X и Y.
в самом простом приближении, Age это:
class Age
{
int age;
public:
struct WrongAgeRange{};
explicit Age(int x)
{
if( x>0 && x<200 )
age=x;
else
throw WrongAgeRange();
}
int value()
{
return age;
}
};
P>>А главное, как тебе тут поможет статический анализатор кода??? E>Он поможет от другого. От того, что передают бинарно несовместимые данные.
эхх, то есть не поможет, то есть зря весь разговор...
P>>ога, как ты там говоришь, поменяем ограничение? сегодня это число центов, завтра сотые доли центов. И что, менять весь код? E>Нет, одну константу...
ога, и все пользователи должны не забывать использовать некую константу
P>>сорри, на курсы телепата ещё не пошёл, и пока не собираюсь E>а что значит "недоступная операция"?
значит что не реализована, и не нужна по семантике задачи.