忽略幀指針有什麼實質性的優化嗎? 如果我已經通過閱讀this頁正確理解,當我們想要避免保存,設置和恢復幀指針時,使用。什麼時候應該省略幀指針?
這是否僅對每個函數調用完成,如果是這樣,是否真的值得爲每個函數避免幾條指令? 是不是微不足道的優化。 除調試限制外,使用此選項的實際含義是什麼?
我整理了以下的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
取代的
用-S編譯再次嘗試diff。比較彙編語言:它會更具可讀性。 –
@理查德:完成!感謝您指出! – PetrosB
相關,請參見[ARM:鏈接寄存器和幀指針](http://stackoverflow.com/q/15752188)。 – jww