LINUX.ORG.RU

Производительность C++

 ,


7

13

Как насчёт производительности у C++ по сравнению с C? Мои предположения на текущий момент:

1) Код, не использующий возможности C++ (то есть по сути plain C), скомпилированный C++ компилятором будет иметь абсолютно ту же производительность, что и код на С.

2) Исключения и dynamic_cast медленные. Если нам важна производительность, лучше их не использовать.

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

4) Класс с виртуальными методами полностью аналогичен пункту 3, но при вызове виртуальных методов добавляется небольшой оверхед. Сишный эквивалент obj->vtable->func(obj, ...). Если сравнивать с plain C кодом, реализующим ООП в той же манере (каждая структура-объект имеет поле, указывающее на структуру, содержащую адреса функций работы с ней), то оверхеда по сравнению с plain C не должно быть.

5) При использовании атрибута класса final (если компилятор поддерживает соответствующий стандарт) даже при наличии виртуальных методов в нём, их вызов будет превращаться в прямые вызовы функций вместо обращения к vtable, если переменная имеет соответствующий тип, а не указатель/ссылка на его предка (который не final).

6) Шаблоны могут привести к разбуханию кода. Впрочем, #define-ы и inline-функции в C++ могут устроить то же самое. Вопрос: будет ли использование шаблона с одинаковыми параметрами создавать 2 копии реализации или же всё-таки компилятор догадается сделать её лишь один раз. А если шаблон используется с одинаковыми параметрами в нескольких объектных файлах? Будет ли реализация расшариваться между ними или у каждого своя?

7) Что насчёт inline-методов класса? (те, которые описываются прямо в момент определения самого класса, внутри блока class). Может ли их реализация расшариваться между модулями или в каждом будет своя копия (допустим, метод слишком длинный, чтобы инлайнится в момент вызова)?

Я не претендую на правоту, какие-то утверждения могут быть ложными. Хотел бы узнать, как обстоят дела на самом деле. А также какие подводные камни я ещё не знаю. Разумеется, речь идёт о последних версиях gcc/clang с включённой оптимизацией не ниже -O2.

★★★★★

Последнее исправление: KivApple (всего исправлений: 1)
Ответ на: комментарий от tailgunner

Он же написал русским языком - кеш за сотни тактов обновляется. А теперь ему приписывают какую-то ересь, какие миллисекунды, потому что не умеют читать тупо.

curufinwe ★★★★★
()
Ответ на: комментарий от curufinwe

О понимании этой фразы иожешь поговорить с анонимусом выше.

tailgunner ★★★★★
()
Ответ на: комментарий от curufinwe

Цытата:

Кеш обновлятся за сотни тактов - квант времени, который исполняется милисекунды.

Какие такие милисекунды?!?

anonymous
()
Ответ на: комментарий от anonymous

О боже больничка. Ты хоть такую явную херню не неси.

Кеш обновлятся за сотни тактов

Это про кеш.

квант времени, который исполняется милисекунды.

Это про процесс.

Как это можно спутать и каким хреном вывести «кеш обновляет милисекунды», когда прямым текстом написано «за сотни тактов».

AnonCxx
()
Ответ на: комментарий от AnonCxx

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

anonymous
()
Ответ на: комментарий от anonymous

тебя так и будут за кривые формулировки и опечатки чморить

Невозможно зачморить царя. Даннинг и Крюгер не дадут его в обиду.

tailgunner ★★★★★
()
Ответ на: комментарий от anonymous

Фразу построил криво - получил за это по соплям.

В чём она кривая - нука объясни.

Все остальное там верно, но тебя так и будут за кривые формулировки и опечатки чморить, поскольку к сути прикопаться нельзя.

Нет там «Фразу построил криво» - ты неправильно прочёл и докопался, а потом понял, что это не так, но всё равно продолжаешь кукарекать про «кривую формулировку».

Раз не понял - формулировка «не понятна», «не прозрачна», но никак не «кривая», либо «неправильная».

AnonCxx
()
Ответ на: комментарий от AnonCxx

Кеш обновлятся за сотни тактов - квант времени, который исполняется милисекунды.

Тебе в школе еще не объяснили что значит дефис в таком контексте?

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.