Esiste una ottimizzazione sostanziale quando si omette il puntatore del frame? Se ho capito correttamente leggendo la pagina this, è usato quando vogliamo evitare di salvare, impostare e ripristinare i puntatori di fotogramma.Quando dovrei omettere il puntatore del frame?
Questo è fatto solo per ogni chiamata di funzione e se sì, vale davvero la pena di evitare alcune istruzioni per ogni funzione? Non è banale per un'ottimizzazione. Quali sono le reali implicazioni dell'utilizzo di questa opzione oltre ai limiti di debug?
ho compilato il seguente codice C con e senza questa opzione
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 i due file ha rivelato il seguente codice assembly:
--- 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
Qualcuno potrebbe far luce sulle chiave punti del codice di cui sopra in cui -fomit-frame-pointer ha in realtà fanno la differenza ?
Edit: 'uscita s sostituito con gcc -S
' objdump
s
Provare nuovamente il diff compilando con -S. Confronta il linguaggio dell'assemblaggio: sarà molto più leggibile. –
@Richard: fatto! Grazie per segnalarlo! – PetrosB
Correlati, vedere [ARM: link register and frame pointer] (http://stackoverflow.com/q/15752188). – jww