2011-02-23 134 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开始的默认值。