Sie sind beide gleich, und wie Sie dies herausfinden können, indem Sie sich ansehen, was der Compiler tut (auch ohne auf hoch eingestellte Optimierung):
Schauen Sie sich an, was der Compiler (gcc 4.0) mit Ihren einfachen Beispielen macht:
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
Daraus können Sie zwei Dinge erkennen: Erstens ist der Code in beiden Fällen gleich.
Zweitens wird der Speicher für var außerhalb der Schleife zugewiesen:
subl $24, %esp
Und schließlich ist das einzige, was in der Schleife steht, die Zuordnung und Bedingungsprüfung:
L3:
movl $4, -12(%ebp)
L2:
cmpl $99, -16(%ebp)
jle L3
Das ist ungefähr so effizient wie möglich, ohne die Schleife vollständig zu entfernen.