繁体   English   中英

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

[英]Performance difference between gcc and g++ for C program

可以说我已经用C语言编写了一个程序,并同时使用gcc和g ++对其进行了编译,哪种编译速度会更快? 是gcc还是g ++? 我认为g ++编译会使其变慢,但不确定。

由于对gcc的争议,让我再次澄清我的问题。

假设我在控制台上像这样编译程序ac。

gcc a.c

g++ a.c

哪个a.out将运行得更快?

首先:这个问题(和其他一些答案)似乎是基于这样一个错误的前提,即C是C ++的严格子集,实际上并非如此。 将C编译为C ++ 不同于将其编译为C:它可以更改程序的含义!

C大部分将像C ++一样进行编译,并且大多数将产生相同的结果,但是有些东西被明确定义以给出不同的行为。

这是一个简单的示例-如果这是您的ac

#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/c-*.cgcc/cp/*.c )。

即使您坚持使用语言中定义为执行相同操作的部分,也无法保证C ++前端将以与C前端完全相同的方式来解析代码(即,将完全相同的输入提供给后端),因此不能保证所生成的代码是相同的。 所以它肯定是可能的,一个可能发生在某些情况下产生比其他更快的代码-尽管我可以想象你需要复杂的代码有找到差异的任何机会,因为大多数的优化和代码生成奇迹发生在编译器的公共后端; 两者之间的差异可能很大。

我认为它们会产生相同的机器代码,因此在您的计算机上也具有相同的速度。

如果您想找出答案,则可以为两者编译程序集并进行比较,但是我敢打赌,它们会创建相同的程序集,因此会创建相同的机器代码。

对其进行分析并进行尝试。 我敢肯定,这将取决于实际的代码,即使它可能需要一个非常奇怪的情况才能获得任何不同的字节码。 虽然如果您在C代码中没有extern C {} ,或者在C中工作正常,我不确定“好像是C ++一样进行编译”可以提供任何速度,除非g ++中进行了特定的编译器优化刚好适合您的特定情况...

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

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

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

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

gcc test.c -otest -x c++

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 ++库。

与GNU C编译器一样,G ++,GNU C ++编译器也是GNU编译器集合的前端。 C编译器之间的区别在于,它自动包含了这些库并进行了一些其他小的调整,因为它假定将要馈送C ++代码进行编译。

这就是混乱的源头。 这会澄清一些事情吗?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM