2010-12-10 35 views
0

我正在閱讀有關C++中異常處理的文章。我在StackOverflow上找到了這個topic。有簡單的測試,我改變了他們一下:C++異常,GCC和「內聯函數」標誌

C代碼:

#include <stdio.h> 
#include <time.h> 

#define BIG 10000000000 

long f(long n) { 
    long r = 0, i = 0; 
    for (i = 0; i < 1000; i++) { 
     r += i; 
     if (n == BIG - 1) { 
       return -1; 
     } 
    } 
    return r; 
} 

int main() { 
    long i = 0, z = 0; 
    for (i = 0; i < BIG; i++) { 
     if ((z = f(i)) == -1) { 
       break; 
     } 
    } 
} 

C++代碼:

#include <stdio.h> 
#include <time.h> 

#define BIG 10000000000 

long f(long n) { 
    long r = 0, i = 0; 
    for (i = 0; i < 1000; i++) { 
     r += i; 
     if (n == BIG - 1) { 
       throw -1; 
     } 
    } 
    return r; 
} 

int main() { 
    long i = 0, z = 0; 
    for (i = 0; i < BIG; i++) { 
     try { 
     z += f(i); 
     } 
     catch(int tmp) { 
       break; 
     } 

     } 
} 

我-02優化選項編譯兩者在結果C程序是更快:

gcc -O2 kod.c -o prog_c 
time ./prog_c 

real 0m8.610s 
user 0m8.520s 
sys 0m0.010s 

g++ -O2 kod.cpp -o prog_cpp 
time ./prog_cpp 

real 0m25.460s 
user 0m25.260s 
sys 0m0.020s 

size prog_cpp 
    text data  bss  dec  hex filename 
    2019  592  32 2643  a53 prog_cpp 

g++ -O2 kod.cpp -o prog_cpp -finline-functions 
time ./prog_cpp 

real 0m8.412s 
user 0m8.390s 
sys 0m0.000s 

size prog_cpp 
    text data  bss  dec  hex filename 
    2019  592  32 2643  a53 prog_cpp 

輸出可執行文件的大小完全一樣,但與-finline-功能的程序編譯的速度要快得多。我試圖調查彙編輸出,

因爲-finline函數僅在第三級GCC優化中啓用,所以它有危險,所以請告訴我爲什麼我不應該用於生產代碼?

我在Intel Core 2 Duo(64位模式)上使用GCC v4.5.2。

+0

爲什麼你認爲'-finline-functions'是危險的? gcc應該在所有優化級別上工作;當你去-O3時它不應該變壞。 – 2010-12-10 20:45:48

+0

因此,總是使用'​​-O3'我做了一件非常錯誤的事情? – 2010-12-10 20:45:57

+0

@Charles:我知道Linux內核開發人員並不喜歡gcc的嚴格別名優化,但是它會在-O2開啓。 – 2010-12-10 20:50:19

回答

1

這些程序並不等同。在C版本中,你返回你的哨兵,但在C++中,你扔它。一個異常不一定返回給調用者,因此一些額外的機器被放置在呼叫站點和被調用函數中以安排展開堆棧。 C中最接近C++異常的是longjmp

當編譯器決定執行內聯優化時,調用者和被調用者都是已知的,並且可以將異常解析爲更便宜的分支。

兩者都是'安全'的,但對於不包含異常的代碼來說,它比代碼使用異常更小一些,速度更快。

+0

是的,我知道,這些程序不等於(我發現它們)。我只對在使用和不使用此優化標記的可執行文件之間的運行時間差異很大而感到好奇。我再次調查了彙編輸出,發現哪一部分是內聯的。另一方面,我不知道,x86上的直接函數調用非常昂貴... – Goofy 2010-12-10 22:35:52