वे दोनों समान हैं, और यहां बताया गया है कि कंपाइलर क्या करता है, यह देखकर आप यह पता लगा सकते हैं (भले ही अनुकूलन उच्च पर सेट न हो):
देखें कि संकलक (gcc 4.0) आपके सरल उदाहरणों के लिए क्या करता है:
1.c:
main(){ int var; while(int i < 100) { var = 4; } }
gcc -S 1. सी
1.s:
_main:
pushl %ebp
movl %esp, %ebp
subl $24, %esp
movl $0, -16(%ebp)
jmp L2
L3:
movl $4, -12(%ebp)
L2:
cmpl $99, -16(%ebp)
jle L3
leave
ret
2.c
main() { while(int i < 100) { int var = 4; } }
gcc -S 2.c
2.s:
_main:
pushl %ebp
movl %esp, %ebp
subl $24, %esp
movl $0, -16(%ebp)
jmp L2
L3:
movl $4, -12(%ebp)
L2:
cmpl $99, -16(%ebp)
jle L3
leave
ret
इनसे, आप दो चीजें देख सकते हैं: सबसे पहले, कोड दोनों में समान है।
दूसरे, var के लिए स्टोरेज को लूप के बाहर आवंटित किया गया है:
subl $24, %esp
और अंत में लूप की एकमात्र चीज़ असाइनमेंट और कंडीशन चेक है:
L3:
movl $4, -12(%ebp)
L2:
cmpl $99, -16(%ebp)
jle L3
जो लगभग उतना ही कुशल है जितना कि आप लूप को पूरी तरह से हटाए बिना हो सकते हैं।