2011-02-23 116 views
9

作爲回答另一個問題的一部分,我想表明,gcc-O3)的瘋狂優化級別基本上會去掉任何未在main中使用的變量。該代碼是:gcc瘋狂的優化級別(-O3)不夠瘋狂嗎?

#include <stdio.h> 
int main (void) { 
    char bing[71]; 
    int x = 7; 
    bing[0] = 11; 
    return 0; 
} 

gcc -O3產量爲:

.file "qq.c" 
    .text 
    .p2align 4,,15 
.globl main 
    .type main, @function 
main: 
    pushl %ebp 
    xorl %eax, %eax 
    movl %esp, %ebp 
    popl %ebp 
    ret 
    .size main, .-main 
    .ident "GCC: (Ubuntu 4.4.3-4ubuntu5) 4.4.3" 
    .section .note.GNU-stack,"",@progbits 

現在我可以看到它的去除局部變量,但仍然有相當多的浪費在那裏。在我看來,整個:

pushl %ebp 
    xorl %eax, %eax 
    movl %esp, %ebp 
    popl %ebp 
    ret 

部分可以替換爲更簡單:

xorl %eax, %eax 
    ret 

有誰有何gcc不執行該優化的任何想法?我知道對於main本身來說,這將節省很少,但是,如果這也是用普通函數完成的話,在大規模循環中不必要地調整堆棧指針的效果將是相當大的。

用來生成組件的命令是:

gcc -O3 -std=c99 -S qq.c 
+0

您能否包含調用gcc的完整命令? – 2011-02-23 02:09:04

回答

9

您可以使用編譯器標誌啓用該特定優化。這樣做會使某些機器上的調試無法進行,而其他任何機器上的調試都會更加困難,這就是爲什麼它通常被禁用的原因。

儘管您的GCC文檔可能會說在不同的優化級別啓用了,但您可能會發現情況並非如此 - 您幾乎肯定必須自己明確啓用它。

6

打開(source)應該擺脫多餘的堆棧操作的。

GCC顯然是因爲它們幫助調試(在需要時獲得堆棧跟蹤)而留下的,儘管文檔注意到是以GCC 4.6開始的默認值。