Gibt es eine wesentliche Optimierung, wenn der Rahmenzeiger weggelassen wird? Wenn ich richtig verstanden habe durch Lesen this Seite, wird verwendet, wenn wir speichern, Einrichten und Wiederherstellen von Frame-Zeigern vermeiden wollen.Wann sollte ich den Rahmenzeiger weglassen?
Wird dies nur für jeden Funktionsaufruf durchgeführt und wenn ja, lohnt es sich wirklich, ein paar Anweisungen für jede Funktion zu vermeiden? Ist es nicht trivial für eine Optimierung? Was sind die tatsächlichen Auswirkungen der Verwendung dieser Option abgesehen von den Debugging-Einschränkungen?
ich die folgende C-Code mit und ohne diese Option kompiliert
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
‚ing die beiden Dateien ergab folgende Assembler-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
Könnte jemand bitte ein Licht auf die Schlüssel Punkte des obigen Codes Schuppen, wo -fomit-frame-pointer tatsächlich den Unterschied gemacht hat ?
Edit:objdump
's Ausgabe ersetzt mit gcc -S
' s
Probieren Sie das Diff erneut aus, indem Sie mit -S kompilieren. Vergleichen Sie die Assemblersprache: Es wird viel besser lesbar sein. –
@Richard: Fertig! Danke für das Aufzeigen! – PetrosB
Siehe auch [ARM: Link-Register und Frame-Zeiger] (http://stackoverflow.com/q/15752188). – jww