Периодически встречаю мнение, что C++ потенциально может быть соптимизирован лучше, чем C, в силу каких-то своих особенностей.
Может кто-нибудь привести примеры кода, где C++ уделает C при условии что это будут семантически эквивалентные программы (а не рантайм факториал в си vs шаблонный факториал C++)?
P.S. действительно интересно, так ли это, но т.к. топик всеравно скатится в холивар C vs C++, сразу создаю его в КСВ :)
Здравствуйте, SilentNoise, Вы писали:
SN>Периодически встречаю мнение, что C++ потенциально может быть соптимизирован лучше, чем C, в силу каких-то своих особенностей. SN>Может кто-нибудь привести примеры кода, где C++ уделает C при условии что это будут семантически эквивалентные программы (а не рантайм факториал в си vs шаблонный факториал C++)?
Здравствуйте, SilentNoise, Вы писали:
SN>Периодически встречаю мнение, что C++ потенциально может быть соптимизирован лучше, чем C, в силу каких-то своих особенностей. SN>Может кто-нибудь привести примеры кода, где C++ уделает C при условии что это будут семантически эквивалентные программы (а не рантайм факториал в си vs шаблонный факториал C++)?
SN>P.S. действительно интересно, так ли это, но т.к. топик всеравно скатится в холивар C vs C++, сразу создаю его в КСВ
Первое, что в голову приходит — это сортировка. Ну и вообще шаблоны + встраивание пользовательского предиката в C++ vs. функция + коллбэк в C.
Одним из 33 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
Здравствуйте, SilentNoise, Вы писали:
SN>Может кто-нибудь привести примеры кода, где C++ уделает C при условии что это будут семантически эквивалентные программы (а не рантайм факториал в си vs шаблонный факториал C++)?
Ну от коммпилятора зависит, но значительная часть примеров будет про "шаблонный факториал" против "рантайм".
Доп возможности по оптимизации в С++ как раз и лежат в области переноса чего-то в CT...
Скажем статический полиморфизм на шаблонах (как в CRTP, например) против вплне так себе динамического в С, скажем на COM-образной технике...
Или С-шный переаллокируемый массив против С++ного-шаблонного.
Правда в С++ есть такойвстроенный пессимизатор, как STL, но он же и оптимиатор при ВЕРНОМ использовании. Так что быстру программу на С++ написать в цеом сложнее.
Ещё есть тема обработки ошибок, кстати. В целом есть такие реализации исключений, что пока исключения не наступают, код получается быстрее, чем ЭКВИВАЛЕНТНЫЙ на кодах возврата...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, SilentNoise, Вы писали:
SN>Периодически встречаю мнение, что C++ потенциально может быть соптимизирован лучше, чем C, в силу каких-то своих особенностей. SN>Может кто-нибудь привести примеры кода, где C++ уделает C при условии что это будут семантически эквивалентные программы (а не рантайм факториал в си vs шаблонный факториал C++)?
SN>P.S. действительно интересно, так ли это, но т.к. топик всеравно скатится в холивар C vs C++, сразу создаю его в КСВ
Как я понимаю, за счёт шаблонов и встраивания можно получить код оптимальнее. Возможно, за счёт реорганизации обработки ошибок и использования искоючений можно сэкономить ещё немного тактов.
Здравствуйте, SilentNoise, Вы писали:
SN>Может кто-нибудь привести примеры кода, где C++ уделает C при условии что это будут семантически эквивалентные программы (а не рантайм факториал в си vs шаблонный факториал C++)?
std::sort быстрее чем qsort потому-что компаратор встраивается (инлайнится) в первом случае, но не во втором. Хотя, строго говоря, это различие относится к стандартным библиотекам, а не к собственно языкам, поскольку на C тоже можно написать алгоритм сортировки в виде макроса компаратор для которого будет определяться (в клиентском коде) при помощи #define. Другое дело, что в том, что касается их использования, такие макроалгоритмы (еще) хуже шаблонов C++.
Здравствуйте, Erop, Вы писали:
E>Ещё есть тема обработки ошибок, кстати. В целом есть такие реализации исключений, что пока исключения не наступают, код получается быстрее, чем ЭКВИВАЛЕНТНЫЙ на кодах возврата...
Здравствуйте, Mystic, Вы писали:
M>Вполне можно заюзать longjmp.
Если можно в С, то можно и в С++...
Мы же об ЭКВИВАЛЕНТНЫХ программах, или уже нет?..
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, SilentNoise, Вы писали:
SN>Периодически встречаю мнение, что C++ потенциально может быть соптимизирован лучше, чем C, в силу каких-то своих особенностей. SN>Может кто-нибудь привести примеры кода, где C++ уделает C при условии что это будут семантически эквивалентные программы (а не рантайм факториал в си vs шаблонный факториал C++)?
Шаблоны. Про сортировку и встраивание сказали. Можно про dead code elimination сказать(хотя оно не так заметно, если не в цикле вызывать по сотни раз). Взять к примеру rapid xml. Там сплошь и рядом такой код
template<int Flags>
static void insert_coded_character(Ch *&text, unsigned long code){
if (Flags & parse_no_utf8){
блабла
} else {
блабла
}
}
Компилятор легко и непринужденно может выкинуть сравнение и одну из then/else ветвей. На си через макросы это делать наверняка не стали бы и просто передали flags как аргумент функции => лишнее сравнение(да ещё место в стеке/регистре заняли). Без шаблонов сделать качественный DCE сложнее.
Здравствуйте, SilentNoise, Вы писали:
SN>Периодически встречаю мнение, что C++ потенциально может быть соптимизирован лучше, чем C, в силу каких-то своих особенностей. SN>Может кто-нибудь привести примеры кода, где C++ уделает C при условии что это будут семантически эквивалентные программы (а не рантайм факториал в си vs шаблонный факториал C++)?
SN>P.S. действительно интересно, так ли это, но т.к. топик всеравно скатится в холивар C vs C++, сразу создаю его в КСВ
всё просто.
В С++ более сильная система типов чем в Си, по этому компилятор С++ имеет больше информации о коде и может делать более эффективные оптимизации.
Здравствуйте, Abyx, Вы писали:
A>В С++ более сильная система типов чем в Си, по этому компилятор С++ имеет больше информации о коде и может делать более эффективные оптимизации.
Это утверждение тоже сильное, но пока голословное. Давай пример.
Здравствуйте, Mystic, Вы писали:
E>>Мы же об ЭКВИВАЛЕНТНЫХ программах, или уже нет?..
M>Ну правильно. Блоку try/catch эквивалентен longjump в C. А коды возврата есть и там и там
Не совсем так. Потому, что есть ещё освобождение ресурсов...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, Mystic, Вы писали:
M>А это считай еще один неявный try/catch, т. е. longjump. Просто все неявное придется реализовывать явно.
Дык это окажется дороже, чем исключения...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, igna, Вы писали:
I>Здравствуйте, Abyx, Вы писали:
A>>В С++ более сильная система типов чем в Си, по этому компилятор С++ имеет больше информации о коде и может делать более эффективные оптимизации.
I>Это утверждение тоже сильное, но пока голословное. Давай пример.
пример — это статика vs динамика, например компиляторы С++ обычно инлайнят вызовы Сallable типов, а компиляторы обычно Си не инлайнят вызовы через указатель на функцию.
чем больше кода инлайнится — тем больше кода можно проанализировать.
если что-то известно на этапе компиляции — то можно не генерить код, определяющий это динамически.
если известно, что размер массива меньше 8 байт, можно скопировать его одной инструкцией, а не вызывая memcpy.
всякие явные `restrict` иногда могут быть не нужны, если компилятор сам может отследить что куски памяти не перекрываются. для этого ему надо видеть откуда взялась память, и не терять информацию о типах
и т.п.
Здравствуйте, SilentNoise, Вы писали:
SN>Периодически встречаю мнение, что C++ потенциально может быть соптимизирован лучше, чем C, в силу каких-то своих особенностей.
Штуки, приходящие на ум:
rvalue references, move constructors, return value optimization, классы для работы с SIMD. Что из этого есть в голом Си? Я не в курсе как-то.
Здравствуйте, SilentNoise, Вы писали:
SN>Периодически встречаю мнение, что C++ потенциально может быть соптимизирован лучше, чем C, в силу каких-то своих особенностей. SN>Может кто-нибудь привести примеры кода, где C++ уделает C при условии что это будут семантически эквивалентные программы (а не рантайм факториал в си vs шаблонный факториал C++)?
У меня были специализорованные под каждый тип SIMD классы, которые делали БВП, на С пришлось бы еще в рантайме выбирать в зависимости от размера и разрядности элемента.