оптимизации C и C++ кода
От: SilentNoise  
Дата: 21.08.12 07:05
Оценка:
Периодически встречаю мнение, что C++ потенциально может быть соптимизирован лучше, чем C, в силу каких-то своих особенностей.
Может кто-нибудь привести примеры кода, где C++ уделает C при условии что это будут семантически эквивалентные программы (а не рантайм факториал в си vs шаблонный факториал C++)?

P.S. действительно интересно, так ли это, но т.к. топик всеравно скатится в холивар C vs C++, сразу создаю его в КСВ :)
Re: оптимизации C и C++ кода
От: Mystic Украина http://mystic2000.newmail.ru
Дата: 21.08.12 07:34
Оценка:
Здравствуйте, SilentNoise, Вы писали:

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

SN>Может кто-нибудь привести примеры кода, где C++ уделает C при условии что это будут семантически эквивалентные программы (а не рантайм факториал в си vs шаблонный факториал C++)?

Проще привести пример наоборот:

void * memcpy(void * restrict s1, const void * restrict s2, size_t n);


должно опттимизироваться лучше, чем версия без restrict. А обртно ничего в голову не лезет. Может быть потому, что изначально C++ транслировался в C?
Re: оптимизации C и C++ кода
От: Хон Гильдон Россия  
Дата: 21.08.12 07:45
Оценка:
Здравствуйте, SilentNoise, Вы писали:

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

SN>Может кто-нибудь привести примеры кода, где C++ уделает C при условии что это будут семантически эквивалентные программы (а не рантайм факториал в си vs шаблонный факториал C++)?

SN>P.S. действительно интересно, так ли это, но т.к. топик всеравно скатится в холивар C vs C++, сразу создаю его в КСВ


Первое, что в голову приходит — это сортировка. Ну и вообще шаблоны + встраивание пользовательского предиката в C++ vs. функция + коллбэк в C.
Одним из 33 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
Re: оптимизации C и C++ кода
От: о_О
Дата: 21.08.12 07:54
Оценка:
>но т.к. топик всеравно скатится в холивар C vs C++, сразу создаю его в КСВ
Вот это врядли.

И вообще, правильные структуры данных и соответствующие им алгоритмы, и в 99% оптимизация в С/С++ какбэ нафиг нужна уже по определению.
Re: оптимизации C и C++ кода
От: Erop Россия  
Дата: 21.08.12 08:04
Оценка:
Здравствуйте, SilentNoise, Вы писали:

SN>Может кто-нибудь привести примеры кода, где C++ уделает C при условии что это будут семантически эквивалентные программы (а не рантайм факториал в си vs шаблонный факториал C++)?


Ну от коммпилятора зависит, но значительная часть примеров будет про "шаблонный факториал" против "рантайм".
Доп возможности по оптимизации в С++ как раз и лежат в области переноса чего-то в CT...

Скажем статический полиморфизм на шаблонах (как в CRTP, например) против вплне так себе динамического в С, скажем на COM-образной технике...
Или С-шный переаллокируемый массив против С++ного-шаблонного.
Правда в С++ есть такойвстроенный пессимизатор, как STL, но он же и оптимиатор при ВЕРНОМ использовании. Так что быстру программу на С++ написать в цеом сложнее.

Ещё есть тема обработки ошибок, кстати. В целом есть такие реализации исключений, что пока исключения не наступают, код получается быстрее, чем ЭКВИВАЛЕНТНЫЙ на кодах возврата...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re: оптимизации C и C++ кода
От: Kernan Ниоткуда https://rsdn.ru/forum/flame.politics/
Дата: 21.08.12 08:06
Оценка:
Здравствуйте, SilentNoise, Вы писали:

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

SN>Может кто-нибудь привести примеры кода, где C++ уделает C при условии что это будут семантически эквивалентные программы (а не рантайм факториал в си vs шаблонный факториал C++)?

SN>P.S. действительно интересно, так ли это, но т.к. топик всеравно скатится в холивар C vs C++, сразу создаю его в КСВ

Как я понимаю, за счёт шаблонов и встраивания можно получить код оптимальнее. Возможно, за счёт реорганизации обработки ошибок и использования искоючений можно сэкономить ещё немного тактов.
Sic luceat lux!
Re: оптимизации C и C++ кода
От: igna Россия  
Дата: 21.08.12 08:09
Оценка: +1
Здравствуйте, SilentNoise, Вы писали:

SN>Может кто-нибудь привести примеры кода, где C++ уделает C при условии что это будут семантически эквивалентные программы (а не рантайм факториал в си vs шаблонный факториал C++)?


std::sort быстрее чем qsort потому-что компаратор встраивается (инлайнится) в первом случае, но не во втором. Хотя, строго говоря, это различие относится к стандартным библиотекам, а не к собственно языкам, поскольку на C тоже можно написать алгоритм сортировки в виде макроса компаратор для которого будет определяться (в клиентском коде) при помощи #define. Другое дело, что в том, что касается их использования, такие макроалгоритмы (еще) хуже шаблонов C++.
Re[2]: оптимизации C и C++ кода
От: Mystic Украина http://mystic2000.newmail.ru
Дата: 21.08.12 08:14
Оценка:
Здравствуйте, Erop, Вы писали:

E>Ещё есть тема обработки ошибок, кстати. В целом есть такие реализации исключений, что пока исключения не наступают, код получается быстрее, чем ЭКВИВАЛЕНТНЫЙ на кодах возврата...


Вполне можно заюзать longjmp.
Re[3]: оптимизации C и C++ кода
От: Erop Россия  
Дата: 21.08.12 09:35
Оценка:
Здравствуйте, Mystic, Вы писали:

M>Вполне можно заюзать longjmp.


Если можно в С, то можно и в С++...
Мы же об ЭКВИВАЛЕНТНЫХ программах, или уже нет?..
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re: оптимизации C и C++ кода
От: maykie Россия  
Дата: 21.08.12 09:52
Оценка:
Здравствуйте, 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 сложнее.
Re: оптимизации C и C++ кода
От: Abyx Россия  
Дата: 21.08.12 10:24
Оценка:
Здравствуйте, SilentNoise, Вы писали:

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

SN>Может кто-нибудь привести примеры кода, где C++ уделает C при условии что это будут семантически эквивалентные программы (а не рантайм факториал в си vs шаблонный факториал C++)?

SN>P.S. действительно интересно, так ли это, но т.к. топик всеравно скатится в холивар C vs C++, сразу создаю его в КСВ


всё просто.
В С++ более сильная система типов чем в Си, по этому компилятор С++ имеет больше информации о коде и может делать более эффективные оптимизации.
In Zen We Trust
Re[4]: оптимизации C и C++ кода
От: Mystic Украина http://mystic2000.newmail.ru
Дата: 21.08.12 10:57
Оценка: -1
Здравствуйте, Erop, Вы писали:

E>Если можно в С, то можно и в С++...

E>Мы же об ЭКВИВАЛЕНТНЫХ программах, или уже нет?..

Ну правильно. Блоку try/catch эквивалентен longjump в C. А коды возврата есть и там и там
Re[2]: оптимизации C и C++ кода
От: igna Россия  
Дата: 21.08.12 11:16
Оценка:
Здравствуйте, Abyx, Вы писали:

A>В С++ более сильная система типов чем в Си, по этому компилятор С++ имеет больше информации о коде и может делать более эффективные оптимизации.


Это утверждение тоже сильное, но пока голословное. Давай пример.
Re[5]: оптимизации C и C++ кода
От: Erop Россия  
Дата: 21.08.12 11:19
Оценка:
Здравствуйте, Mystic, Вы писали:

E>>Мы же об ЭКВИВАЛЕНТНЫХ программах, или уже нет?..


M>Ну правильно. Блоку try/catch эквивалентен longjump в C. А коды возврата есть и там и там


Не совсем так. Потому, что есть ещё освобождение ресурсов...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[6]: оптимизации C и C++ кода
От: Mystic Украина http://mystic2000.newmail.ru
Дата: 21.08.12 11:45
Оценка:
Здравствуйте, Erop, Вы писали:

E>Не совсем так. Потому, что есть ещё освобождение ресурсов...


А это считай еще один неявный try/catch, т. е. longjump. Просто все неявное придется реализовывать явно.
Re[7]: оптимизации C и C++ кода
От: Erop Россия  
Дата: 21.08.12 12:17
Оценка:
Здравствуйте, Mystic, Вы писали:

M>А это считай еще один неявный try/catch, т. е. longjump. Просто все неявное придется реализовывать явно.


Дык это окажется дороже, чем исключения...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re: оптимизации C и C++ кода
От: Patalog Россия  
Дата: 21.08.12 12:32
Оценка:
Здравствуйте, SilentNoise, Вы писали:

Тут уже как то пробегала ссылка, напомню
http://easyelectronics.ru/rabota-s-portami-vvoda-vyvoda-mikrokontrollerov-na-si.html
Почетный кавалер ордена Совка.
Re[3]: оптимизации C и C++ кода
От: Abyx Россия  
Дата: 21.08.12 16:21
Оценка:
Здравствуйте, igna, Вы писали:

I>Здравствуйте, Abyx, Вы писали:


A>>В С++ более сильная система типов чем в Си, по этому компилятор С++ имеет больше информации о коде и может делать более эффективные оптимизации.


I>Это утверждение тоже сильное, но пока голословное. Давай пример.


пример — это статика vs динамика, например компиляторы С++ обычно инлайнят вызовы Сallable типов, а компиляторы обычно Си не инлайнят вызовы через указатель на функцию.
чем больше кода инлайнится — тем больше кода можно проанализировать.
если что-то известно на этапе компиляции — то можно не генерить код, определяющий это динамически.
если известно, что размер массива меньше 8 байт, можно скопировать его одной инструкцией, а не вызывая memcpy.
всякие явные `restrict` иногда могут быть не нужны, если компилятор сам может отследить что куски памяти не перекрываются. для этого ему надо видеть откуда взялась память, и не терять информацию о типах
и т.п.
In Zen We Trust
Re: оптимизации C и C++ кода
От: D. Mon Великобритания http://thedeemon.livejournal.com
Дата: 21.08.12 16:47
Оценка:
Здравствуйте, SilentNoise, Вы писали:

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


Штуки, приходящие на ум:
rvalue references, move constructors, return value optimization, классы для работы с SIMD. Что из этого есть в голом Си? Я не в курсе как-то.
Re: оптимизации C и C++ кода
От: dеnisko  
Дата: 21.08.12 16:50
Оценка:
Здравствуйте, SilentNoise, Вы писали:

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

SN>Может кто-нибудь привести примеры кода, где C++ уделает C при условии что это будут семантически эквивалентные программы (а не рантайм факториал в си vs шаблонный факториал C++)?
У меня были специализорованные под каждый тип SIMD классы, которые делали БВП, на С пришлось бы еще в рантайме выбирать в зависимости от размера и разрядности элемента.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.