pax*_*blo 9 optimization gcc stack-frame
作为回答另一个问题的一部分,我想表明gcc(-O3)的疯狂优化级别基本上会删除任何未在main中使用的变量.代码是:
#include <stdio.h>
int main (void) {
char bing[71];
int x = 7;
bing[0] = 11;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
和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
Run Code Online (Sandbox Code Playgroud)
现在我可以看到它删除了局部变量,但那里仍有相当多的浪费.在我看来,整个:
pushl %ebp
xorl %eax, %eax
movl %esp, %ebp
popl %ebp
ret
Run Code Online (Sandbox Code Playgroud)
部分可以用更简单的替换:
xorl %eax, %eax
ret
Run Code Online (Sandbox Code Playgroud)
有谁知道为什么gcc不执行此优化?我知道这样可以节省很多,main但是,如果这也是通过普通函数完成的,那么在大规模循环中不必要地调整堆栈指针的效果将是相当大的.
用于生成程序集的命令是:
gcc -O3 -std=c99 -S qq.c
Run Code Online (Sandbox Code Playgroud)
您可以使用-fomit-frame-pointer编译器标志启用该特定优化.这样做会使某些机器上的调试变得不可能,而其他所有机器上的调试也更加困难,这就是它通常被禁用的原因.
虽然您的GCC文档可能会说-fomit-frame-pointer在各种优化级别启用,但您可能会发现情况并非如此 - 您几乎肯定必须自己明确启用它.