省略帧指针时是否有任何实质性的优化?
如果我通过阅读this页面正确理解了该信息,则在我们要避免保存,设置和还原帧指针时使用-fomit-frame-pointer
是否仅对每个函数调用都执行此操作,如果是,是否真的值得避免为每个函数使用几条指令?
进行优化不是很简单。
除了调试限制之外,使用此选项的实际含义是什么?
有无此选项,我编译了以下C代码

int main(void)
{
        int i;

        i = myf(1, 2);
}

int myf(int a, int b)
{
        return a + b;
}
# gcc -S -fomit-frame-pointer code.c -o withoutfp.s
# gcc -S code.c -o withfp.s

这两个文件的diff -u显示了以下汇编代码:

--- withfp.s    2009-12-22 00:03:59.000000000 +0000
+++ withoutfp.s 2009-12-22 00:04:17.000000000 +0000
@@ -7,17 +7,14 @@
        leal    4(%esp), %ecx
        andl    $-16, %esp
        pushl   -4(%ecx)
-       pushl   %ebp
-       movl    %esp, %ebp
        pushl   %ecx
-       subl    $36, %esp
+       subl    $24, %esp
        movl    $2, 4(%esp)
        movl    $1, (%esp)
        call    myf
-       movl    %eax, -8(%ebp)
-       addl    $36, %esp
+       movl    %eax, 20(%esp)
+       addl    $24, %esp
        popl    %ecx
-       popl    %ebp
        leal    -4(%ecx), %esp
        ret
        .size   main, .-main
@@ -25,11 +22,8 @@
 .globl myf
        .type   myf, @function
 myf:
-       pushl   %ebp
-       movl    %esp, %ebp
-       movl    12(%ebp), %eax
-       addl    8(%ebp), %eax
-       popl    %ebp
+       movl    8(%esp), %eax
+       addl    4(%esp), %eax
        ret
        .size   myf, .-myf
        .ident  "GCC: (GNU) 4.2.1 20070719
有人可以说明一下上面代码的点,其中-fomit-frame-pointer实际上起到了作用吗?
编辑: objdump的输出替换为gcc -S

最佳答案

-fomit-frame-pointer允许一个额外的寄存器供通用使用。我认为这实际上对32位x86来说只是一个大问题,对于寄存器来说有点饿了。

人们会希望看到EBP不再在每个函数调用中都得到保存和调整,并且可能在常规代码中增加了EBP的使用,并且在EBP用作通用寄存器的情况下减少了堆栈操作。

您的代码太简单了,以至于看不到这种优化有任何好处-您使用的寄存器不足。此外,您还没有打开优化器,这可能是查看其中一些效果所必需的。

* ISA寄存器,而不是微体系结构寄存器。

关于c - 我什么时候应该省略帧指针?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1942801/

10-10 22:58