簡體   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