Gibt es eine wesentliche Optimierung, wenn der Rahmenzeiger weggelassen wird? Wenn ich das beim Lesen richtig verstanden habe Dies Seite, -fomit-frame-pointer
wird verwendet, wenn wir das Speichern, Einrichten und Wiederherstellen von Frame-Zeigern vermeiden möchten.
Wird das nur bei jedem Funktionsaufruf gemacht und wenn ja, lohnt es sich wirklich, ein paar Anweisungen für jede Funktion zu vermeiden? Ist das nicht trivial für eine Optimierung. Was sind die tatsächlichen Auswirkungen der Verwendung dieser Option, abgesehen von den Debugging-Einschränkungen?
Ich habe den folgenden 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
Das Auslesen der beiden Dateien ergab den folgenden 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 bitte jemand Licht ins Dunkel bringen Schlüssel Punkte des obigen Codes, wo -fomit-frame-pointer tatsächlich den Unterschied gemacht hat?
Bearbeiten: objdump
‘s Ausgabe ersetzt durch gcc -S
‘s
Versuchen Sie es erneut, indem Sie mit -S kompilieren. Vergleichen Sie die Assemblersprache: Sie wird viel besser lesbar sein.
– Richard Pennington
21. Dezember 2009 um 21:56 Uhr
@Richard: Fertig! Danke für den Hinweis!
– PetrosB
21. Dezember 2009 um 22:09 Uhr
Verwandte, siehe ARM: Linkregister und Rahmenzeiger.
– jww
26. Juni 2016 um 12:22 Uhr