Optimization gcc疯狂优化级别(-O3)是否不够疯狂?

Optimization gcc疯狂优化级别(-O3)是否不够疯狂?,optimization,gcc,stack-frame,Optimization,Gcc,Stack Frame,作为回答另一个问题的一部分,我想表明,gcc(-O3)的疯狂优化水平基本上会去除所有未在main中使用的变量。代码是: #include <stdio.h> int main (void) { char bing[71]; int x = 7; bing[0] = 11; return 0; } 现在我可以看到它删除了局部变量,但仍然有相当多的浪费。在我看来,整个: pushl %ebp xorl %eax, %eax movl %e

作为回答另一个问题的一部分,我想表明,
gcc
-O3
)的疯狂优化水平基本上会去除所有未在main中使用的变量。代码是:

#include <stdio.h>
int main (void) {
   char bing[71];
   int x = 7;
   bing[0] = 11;
   return 0;
}
现在我可以看到它删除了局部变量,但仍然有相当多的浪费。在我看来,整个:

    pushl %ebp
    xorl %eax, %eax
    movl %esp, %ebp
    popl %ebp
    ret
第节可替换为更简单的:

    xorl %eax, %eax
    ret
有人知道为什么
gcc
不执行此优化吗?我知道这对
main
本身几乎没有什么好处,但是,如果这也是用普通函数实现的,那么在大规模循环中不必要地调整堆栈指针的效果将是相当可观的

用于生成程序集的命令为:

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

启用
-fomit frame pointer
()应该可以消除额外的堆栈操作


GCC显然保留了这些选项,因为它们有助于调试(在需要时获取堆栈跟踪),尽管文档指出,
-fomit frame pointer
是从GCC 4.6开始的默认值。

您可以使用
-fomit frame pointer
编译器标志启用特定的优化。这样做会使某些机器上的调试变得不可能,而其他机器上的调试则更加困难,这就是为什么它通常被禁用的原因


尽管您的GCC文档可能会说,
-fomit frame pointer
是在各种优化级别启用的,但您可能会发现,您几乎肯定不需要自己显式启用它。

您可以包含调用GCC的完整命令吗?
gcc -O3 -std=c99 -S qq.c