C程序的gcc和g ++之间的性能差异

时间:2010-07-21 18:45:03

标签: c gcc g++

让我们说我用C编写了一个程序并用gcc和g ++编译它,编译运行得更快? gcc还是g ++?我认为g ++编译会使它变慢,但不确定。

让我再次澄清我的问题,因为有关gcc的说法。

假设我在控制台上编译这样的程序a.c。

gcc a.c

g++ a.c

哪个a.out运行得更快?

6 个答案:

答案 0 :(得分:26)

首先:问题(以及其他一些答案)似乎是基于错误的前提,即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 ++会产生不同的结果(除非您使用intchar大小相同的异常平台):

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

因为C规范将字符文字定义为类型int,而C ++规范将其定义为类型char

其次:gccg++不是“相同的编译器”。使用相同的后端代码,但C和C ++前端是不同的代码片段(gcc源代码中的gcc/c-*.cgcc/cp/*.c)。

即使您坚持使用定义为执行相同操作的语言部分,也无法保证C ++前端将以与C前端完全相同的方式解析代码(即准确地给出相同的输入到后端),因此不能保证生成的代码是相同的。因此,在某些情况下,有可能可能可能会生成比其他代码更快的代码 - 尽管我会想象您需要复杂的代码才能找到差异,因为大多数优化和代码生成魔术发生在编译器的公共后端;差异可以是两种方式。

答案 1 :(得分:2)

我认为他们将生成相同的机器代码,因此您的计算机上的速度相同。

如果你想知道,你可以为两者编译程序集并比较两者,但我打赌他们创建相同的程序集,因此相同的机器代码。

答案 2 :(得分:2)

简介并尝试一下。我确定它将取决于实际的代码,即使它需要一个非常奇怪的情况来获得任何不同的字节码。虽然你的C代码周围没有extern C {},或者在C中工作正常,但我不确定“将它编译为C ++”可以提供任何速度,除非特定的编译器优化在g ++ 刚刚发生对你的特殊情况有点好......

答案 3 :(得分:2)

生成的机器代码应该相同。 a.out的g ++版本可能会链接到几个额外的支持库中。这将使一些系统调用的a.out启动时间变慢。

但实际上没有任何实际差异。在您达到20-40个链接库和数千个要解析的符号之前,Linux链接器不会明显变慢。

答案 4 :(得分:2)

gcc和g ++可执行文件只是前端,它们不是实际的编译器。它们都基于文件扩展名运行实际的C或C ++编译器(以及ld,ar,生成所要求的输出所需的任何内容)。所以你会得到完全相同的结果。 G ++通常用于C ++,因为它与标准C ++库(iostreams等)链接。

如果要将C代码编译为C ++,请更改文件扩展名,或执行以下操作:

gcc test.c -otest -x c++

答案 5 :(得分:-1)

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编译器。如果给出-lstdc ++命令,这将编译C ++代码,但通常会因为它没有引入C ++库而窒息而死。

G ++,GNU C ++编译器,就像GNU C编译器一样,是GNU编译器集合的前端。 C编译器之间的区别在于它自动包含这些库并进行了一些其他的小调整,因为它假设它将被提供给C ++代码进行编译。

这就是混乱的来源。这有点澄清一点吗?