これらは両方とも同じであり、コンパイラーの機能を確認することで、次のように確認できます(最適化を高く設定しなくても)。
コンパイラ(gcc 4.0)が単純な例に対して何をするかを見てください。
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
これらから、2つのことがわかります。1つは、コードが両方で同じであるということです。
次に、varのストレージがループの外側に割り当てられます。
subl $24, %esp
そして最後に、ループ内の唯一のものは、割り当てと条件のチェックです。
L3:
movl $4, -12(%ebp)
L2:
cmpl $99, -16(%ebp)
jle L3
これは、ループを完全に削除せずにできる限り効率的です。