Разница в производительности между gcc и g ++ для программы на C - PullRequest
7 голосов
/ 21 июля 2010

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

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

Допустим, я скомпилирую на консоли программу a.c следующим образом.

gcc a.c

g++ a.c

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

Ответы [ 6 ]

26 голосов
/ 22 июля 2010

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

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

Вот простой пример - если это ваш a.c:

#include <stdio.h>

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

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

$ gcc a.c
$ ./a.out
4

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

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

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

Во-вторых: gcc и g++не "тот же компилятор".Используется один и тот же внутренний код, но внешние интерфейсы C и C ++ - это разные куски кода (gcc/c-*.c и gcc/cp/*.c в исходном коде gcc).

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

2 голосов
/ 21 июля 2010

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

gcc test.c -otest -x c++
2 голосов
/ 21 июля 2010

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

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

2 голосов
/ 21 июля 2010

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

2 голосов
/ 21 июля 2010

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

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

0 голосов
/ 21 июля 2010

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

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

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

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

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

Отсюда и неразбериха. Это немного проясняет ситуацию?

...