代码之家  ›  专栏  ›  技术社区  ›  itsaboutcode

g c c和g++for c程序的性能差异

  •  7
  • itsaboutcode  · 技术社区  · 14 年前

    假设我已经用C语言编写了一个程序,并用g c c和g++编译了它,那么哪个编译会运行得更快?GCC还是G+?我认为G++编译会使它变慢,但不确定。

    让我再次澄清我的问题,因为关于海湾合作委员会的争论。

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

    gcc a.c
    
    g++ a.c
    

    哪个A.out跑得更快?

    6 回复  |  直到 11 年前
        1
  •  -1
  •   Memos Electron    11 年前

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

    gcc是一个编译器集合。它主要用于编译C、C++、艾达、JAVA和更多的编程语言。 G++是GNU编译器集合(GCC)的一部分。
    我的意思是GCC也包括G+。当我们使用GCC编译C++时,它使用的是G++。输出文件将不同,因为g++编译器使用自己的运行时库。

    编辑: 好的,澄清一下,因为我们在这里命名有点混乱。gcc是GNU编译器集合。它可以编译艾达、C++、C和其他十亿零一种语言。它是各种语言“前端”编译器(如gnat)的“后端”。去读我在gcc.gnu.org页面顶部创建的链接。

    gcc也可以引用gnu c编译器。如果使用-LSTDC++命令,这将编译C++代码,但通常会阻塞和死亡,因为它没有拉入C++库。

    G++,GNU C++编译器,类似于GNU C编译器,是GNU编译器集合的前端。C编译器的不同之处在于,它自动地包含这些库并进行一些其他的小调整,因为它假设它将被编译为C++代码来编译。

    这就是困惑的根源。这能澄清一点吗?

        2
  •  26
  •   Matthew Slattery    14 年前

    首先,问题(和其他一些答案)似乎是基于错误的前提,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++规范将其定义为具有类型 烧焦 .

    其次: gcc g++ 不是“同一个编译器”。使用相同的后端代码,但C和C++前端是不同的代码块。 gcc/c-*.c gcc/cp/*.c 在gcc来源中)。

    即使你坚持的语言的部分被定义为做同样的事情,也不能保证C++前端将以与C前端完全相同的方式解析代码(即给后端完全相同的输入),因此不能保证生成的代码将是相同的。当然是这样 可能的 在某些情况下,一个可能会比另一个生成更快的代码——尽管我可以想象,您需要复杂的代码才能找到差异,因为大多数优化和代码生成的魔力都发生在编译器的公共后端;两者之间的差异可能是相反的。

        3
  •  2
  •   KLee1    14 年前

    我认为它们都会产生相同的机器代码,因此在你的电脑上也会有相同的速度。

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

        4
  •  2
  •   eruciform    14 年前

    分析一下,试试看。我敢肯定,它将取决于实际的代码,即使它可能需要一个非常奇怪的情况来获得任何不同的字节码。但是如果你没有 extern C {} 在C代码的周围,或者在C中工作得很好,我不知道如何“编译它就像C++”可以提供任何速度,除非G++中的特定编译器优化。 刚好发生 为了更好地适应你的特殊情况…

        5
  •  2
  •   Zan Lynx    14 年前

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

    但实际上并没有什么实际的区别。在达到20-40个链接库和数千个要解析的符号之前,Linux链接器不会明显变慢。

        6
  •  2
  •   torhu    14 年前

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

    如果你想把C代码编译成C++,要么改变文件扩展名,要么像这样做:

    gcc test.c -otest -x c++