İkisi de aynıdır ve derleyicinin ne yaptığına bakarak nasıl öğrenebileceğiniz aşağıda açıklanmıştır (optimizasyon yüksek olarak ayarlanmasa bile):
Derleyicinin (gcc 4.0) basit örneklerinize ne yaptığına bakın:
1.c:
main(){ int var; while(int i < 100) { var = 4; } }
gcc -S 1.c
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
Bunlardan iki şey görebilirsiniz: Birincisi, kod her ikisinde de aynıdır.
İkinci olarak, var için depolama alanı döngünün dışında ayrılır:
subl $24, %esp
Ve son olarak döngüdeki tek şey atama ve koşul kontrolüdür:
L3:
movl $4, -12(%ebp)
L2:
cmpl $99, -16(%ebp)
jle L3
Bu, döngüyü tamamen kaldırmadan olabildiğince verimli.