我正在閱讀有關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。
爲什麼你認爲'-finline-functions'是危險的? gcc應該在所有優化級別上工作;當你去-O3時它不應該變壞。 – 2010-12-10 20:45:48
因此,總是使用'-O3'我做了一件非常錯誤的事情? – 2010-12-10 20:45:57
@Charles:我知道Linux內核開發人員並不喜歡gcc的嚴格別名優化,但是它會在-O2開啓。 – 2010-12-10 20:50:19