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