Разница в производительности между gcc и g ++ для программы C

Допустим, я написал программу на C и скомпилировал ее как с gcc, так и с g ++, компиляция которой будет работать быстрее? gcc или g ++? Я думаю, что компиляция g ++ сделает ее медленной, но не уверен в этом.

Позвольте мне уточнить мой вопрос снова из-за конфутации о gcc.

Скажем, я компилирую программу ac так, как на консоли.

gcc ac g++ ac 

который будет работать быстрее?

http://gcc.gnu.org/onlinedocs/gcc-3.3.6/gcc/G_002b_002b-and-GCC.html

GCC – это compilation компиляторов. Он в основном используется для компиляции C, C ++, Ada, Java и многих других языков программирования. G ++ является частью коллекции компиляторов gnu (gcc).
Я имею в виду, что gcc включает g ++. Когда мы используем gcc для компиляции C ++, он использует g ++. Выходные файлы будут разными, потому что компилятор G ++ использует свою собственную библиотеку времени выполнения.

Изменить: Хорошо, чтобы прояснить ситуацию, потому что у нас есть немного путаницы в названии здесь. GCC – compilation компиляторов GNU. Он может компилировать Ada, C ++, C и миллиард с половиной других языков. Это «бэкэнд» для компиляторов «front end» различных языков, таких как GNAT. Пойдите, прочитайте ссылку, которую я сделал в верхней части страницы от GCC.GNU.Org.

GCC также может ссылаться на компилятор GNU C. Это скомпилирует код C ++, если задана команда -lstdc ++, но, как правило, будет задыхаться и умирать, потому что она не вытягивает библиотеки C ++.

G ++, компилятор GNU C ++, как и компилятор GNU C, является интерфейсом compilationа компиляторов GNU. Разница между C-компилятором заключается в том, что он автоматически включает эти библиотеки и делает несколько других небольших настроек, потому что предполагается, что он будет загружаться с C ++-кодом для компиляции.

Здесь возникает путаница. Это немного проясняет ситуацию?

Во-первых: вопрос (и некоторые другие ответы), по-видимому, основывается на ошибочной предпосылке, что C является строгим подмножеством C ++, что на самом деле не так. Компиляция C как C ++ – это не то же самое, что скомпилировать ее как C: она может изменить смысл вашей программы!

C будет в основном компилироваться как C ++ и будет в основном давать те же результаты, но есть некоторые вещи, которые явно определены для того, чтобы дать другое поведение.

Вот простой пример – если это ваш ac :

 #include  int main(void) { printf("%d\n", sizeof('x')); return 0; } 

то компиляция в виде C даст один результат:

 $ gcc ac $ ./a.out 4 

и компиляция, поскольку C ++ даст другой результат (если вы не используете необычную платформу, где int и char имеют одинаковый размер):

 $ g++ ac $ ./a.out 1 

потому что спецификация C определяет литерал символа, который имеет тип int , а спецификация C ++ определяет его, чтобы иметь тип char .

Во-вторых: gcc и g++ не являются «одним и тем же компилятором». Используется один и тот же код конца, но передние концы C и C ++ представляют собой разные fragmentы кода ( gcc/c-*.c и gcc/cp/*.c в источнике gcc).

Даже если вы придерживаетесь частей языка, которые определены для того, чтобы сделать то же самое, нет гарантии, что передняя часть C ++ будет анализировать код точно так же, как и передняя часть C (то есть дает точно такой же вход для задний конец), и, следовательно, не гарантирует, что сгенерированный код будет идентичным. Таким образом, возможно, что в некоторых случаях возможно генерировать более быстрый код, чем другой, хотя я бы предположил, что вам понадобится сложный код, чтобы иметь хоть какой-то шанс найти разницу, так как большая часть оптимизации и генерации кода происходит в общем конце компилятора; и разница может быть в любом порядке.

Я думаю, что они оба будут производить один и тот же машинный код и, следовательно, такую ​​же скорость на вашем компьютере.

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

Профилируйте его и попробуйте. Я уверен, что это будет зависеть от реального кода, даже если для этого потребуется потенциально реальный странный случай получить любой другой байт-код. Хотя, если у вас нет extern C {} вокруг вашего C-кода и не работает на C, я не уверен, как «компиляция его, как если бы это была C ++», могла обеспечить любую скорость, если только определенные оптимизации компилятора в g ++ просто оказаться немного лучше для вашей конкретной ситуации …

Сгенерированный машинный код должен быть идентичным. Вероятно, версия g.g ++ g ++ будет связана с несколькими дополнительными библиотеками поддержки. Это заставит время запуска a.out быть медленнее с помощью нескольких системных вызовов.

Однако на самом деле нет никакой практической разницы. Линкером Linux не станет заметно медленнее, пока вы не достигнете 20-40 связанных библиотек и тысяч символов для разрешения.

Исполняемые файлы gcc и g ++ – это просто интерфейсы, они не являются настоящими компиляторами. Они оба запускают фактические компиляторы C или C ++ (и ld, ar, независимо от того, что необходимо для получения выведенного вами результата) на основе расширений файлов. Таким образом, вы получите тот же результат. G ++ обычно используется для C ++, поскольку он связан со стандартной библиотекой C ++ (iostreams и т. Д.).

Если вы хотите скомпилировать C-код как C ++, либо измените расширение файла, либо выполните следующее:

 gcc test.c -otest -x c ++