什么时候应该省略帧指针? [英] When should I omit the frame pointer?

查看:97
本文介绍了什么时候应该省略帧指针?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

是否有省略帧指针时,任何实质性的优化?
如果我通过阅读 页面,<$ C $当我们要避免储蓄,建立和恢复帧指针C> -fomit-frame-pointer的被使用。

Is there any substantial optimization when omitting the frame pointer? If I have understood correctly by reading this page, -fomit-frame-pointer is used when we want to avoid saving, setting up and restoring frame pointers.

这是唯一做了每个函数调用,如果是的话,是不是真的值得以避免为每个函数一些说明?
是不是很琐碎的优化。
什么是使用这个选项除了调试限制的实际含义是什么?

Is this done only for each function call and if so, is it really worth to avoid a few instructions for every function? Isn't it trivial for an optimization. What are the actual implications of using this option apart from the debugging limitations?

我编译下面的C code使用和不使用此选项

I compiled the following C code with and without this option

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

差异-u 'ING两个文件揭示了以下汇编code:

diff -u 'ing the two files revealed the following assembly code:


--- 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 

可能有人请阐明在键指示灯以上code其中-fomit-frame-pointer的根本实际上使差异点?

Could someone please shed light on the key points of the above code where -fomit-frame-pointer did actually make the difference?

编辑: objdump的的输出替换 GCC -S

推荐答案

-fomit-frame-pointer的允许一个额外的寄存器可用于一般用途。我认为这是真的只在32位x86,这是一个有点饿寄存器什么大不了的事。*

-fomit-frame-pointer allows one extra register to be available for general-purpose use. I would assume this is really only a big deal on 32-bit x86, which is a bit starved for registers.*

一个希望看到的EBP不再保存并在每个函数调用调整,并在正常code可能是一些附加使用的EBP,和更少的堆栈操作上,其中EBP被用作通用寄存器场合。

One would expect to see EBP no longer saved and adjusted on every function call, and probably some additional use of EBP in normal code, and fewer stack operations on occasions where EBP gets used as a general-purpose register.

您code是过于简单,看到这种你没有使用足够的寄存器optimization--任何好处。此外,你还没有打开的优化,这可能需要看到一些这些影响。

Your code is far too simple to see any benefit from this sort of optimization-- you're not using enough registers. Also, you haven't turned on the optimizer, which might be necessary to see some of these effects.

* ISA寄存器,而不是微架构寄存器。

* ISA registers, not micro-architecture registers.

这篇关于什么时候应该省略帧指针?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆