वहाँ किसी भी पर्याप्त अनुकूलन जब फ्रेम सूचक को छोड़ते हुए है? मैं this पेज पढ़कर सही ढंग से समझ लिया है, तो प्रयोग किया जाता है जब हम बचत से बचना चाहते हैं, की स्थापना और फ्रेम संकेत बहाल।मुझे फ्रेम सूचक को कब छोड़ना चाहिए?
क्या यह केवल प्रत्येक फ़ंक्शन कॉल के लिए किया जाता है और यदि ऐसा है, तो क्या यह वास्तव में प्रत्येक फ़ंक्शन के लिए कुछ निर्देशों से बचने के लायक है? एक अनुकूलन के लिए तुच्छ है ना। डिबगिंग सीमाओं से अलग इस विकल्प का उपयोग की वास्तविक निहितार्थ क्या हैं?
मैं,
# gcc -S -fomit-frame-pointer code.c -o withoutfp.s
# gcc -S code.c -o withfp.s
साथ और इस विकल्प
int main(void)
{
int i;
i = myf(1, 2);
}
int myf(int a, int b)
{
return a + b;
}
बिना निम्नलिखित सी कोड संकलित।
--- 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 फ्रेम-सूचक वास्तव में फर्क था की कुंजी बिंदुओं पर प्रकाश डाला कृपया सकते हैं:
diff -u
'दो फ़ाइलों ing निम्नलिखित विधानसभा कोड का पता चला ?
संपादित करें:objdump
के उत्पादन gcc -S
के साथ बदल दिया है
-एस के साथ संकलन करके फिर से अंतर का प्रयास करें। असेंबली भाषा की तुलना करें: यह बहुत अधिक पठनीय होगा। –
@ रिचर्ड: हो गया! इस पर ध्यान दिलाने के लिए धन्यवाद! – PetrosB
संबंधित, देखें [एआरएम: लिंक रजिस्टर और फ्रेम पॉइंटर] (http://stackoverflow.com/q/15752188)। – jww