Хотя это старый вопрос, я бы хотел добавить сюда свои 5 центов, так как я, вероятно, не единственный, кто находит этот вопрос через поисковик.
Я не могу комментировать скорость компиляции, но скорость выполнения:
Насколько я знаю, в c ++ есть только одна функция, которая стоит производительности, даже если вы ее не используете. Эта особенность является исключением для c ++, потому что она предотвращает несколько оптимизаций компилятора (именно поэтому в c ++ 11 была введена noexcept
). Однако, если вы используете какой-то механизм проверки ошибок, исключения, вероятно, будут более эффективными, чем комбинация проверки возвращаемого значения и большого количества операторов if else
. Это особенно верно, если вам нужно увеличить ошибку в стеке.
В любом случае, если вы отключите исключения во время компиляции, в C ++ не будет никаких накладных расходов, за исключением случаев, когда вы намеренно используете связанные функции (например, вам не нужно платить за полиморфизм, если вы не используете виртуальные функции), тогда как большинство функций вообще не вносят накладных расходов (перегрузка, шаблоны, пространства имен aso).
С другой стороны, большинство форм универсального кода будет намного быстрее в c ++, чем эквивалент в c, потому что c ++ предоставляет встроенные механизмы (шаблоны и классы) для этого. Типичным примером является csort qsort против c ++ std :: sort. Версия c ++ обычно намного быстрее, потому что внутри сортировки используемая функция компаратора известна во время компиляции, которая, по крайней мере, сохраняет вызов посредством поиска функции и в лучшем случае допускает много дополнительных оптимизаций компилятора.
Тем не менее, "проблема" в c ++ заключается в том, что легко скрыть сложность от пользователя, так что, казалось бы, невинный код может оказаться намного медленнее, чем ожидалось. Это происходит главным образом из-за перегрузки операторов, полиморфизма и конструкторов / деструкторов, но даже простой вызов функции-члена скрывает переданный this
-пункт, который также не является NOP.
Учитывая перегрузку операторов: когда вы видите *
в c, вы знаете, что это (на большинстве архитектур) единственная дешевая инструкция на ассемблере, с другой стороны, в c ++ это может быть вызов сложной функции (подумайте о умножении матриц). Это не значит, что вы могли бы реализовать ту же функциональность в c быстрее, но в c ++ вы не видите, что это может быть дорогостоящей операцией.
Деструкторы - это аналогичный случай: в «современном» c ++ вы вряд ли увидите какие-либо явные разрушения с помощью удаления, но любая локальная переменная, которая выходит из области видимости, может потенциально вызвать дорогой вызов (виртуального) деструктора без единой строки кода, указывающей на это. (игнорируя }
конечно).
И, наконец, некоторые люди (особенно из Java) склонны писать сложные иерархии классов с большим количеством виртуальных функций, где каждый вызов такой функции является скрытым косвенным вызовом функции, который трудно или невозможно оптимизировать.
Таким образом, хотя скрывать сложность от программиста - это, в общем, хорошая вещь, иногда она оказывает негативное влияние на время выполнения, если программист не знает о стоимости этих «простых в использовании» конструкций.
В качестве резюме я бы сказал, что c ++ облегчает неопытным программистам писать медленный код (потому что они не видят неэффективности непосредственно в программе). Но c ++ также позволяет хорошим программистам писать «хороший», корректный и быстрый код быстрее, чем с c, что дает им больше времени для размышлений об оптимизации, когда они действительно необходимы.
P.S:.
Две вещи, которые я не упомянул (вероятно, среди прочих, которые я просто забыл), это способность c ++ для сложных вычислений времени компиляции (благодаря шаблонам и constexpr) и ключевое слово c restrict. Это связано с тем, что ни одна из них еще не использовалась в программах, критичных ко времени, и поэтому я не могу комментировать их общую полезность и реальный выигрыш в производительности.