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