Cả hai đều giống nhau và đây là cách bạn có thể tìm hiểu, bằng cách xem trình biên dịch làm gì (ngay cả khi không đặt tối ưu hóa thành cao):
Hãy xem trình biên dịch (gcc 4.0) làm gì với các ví dụ đơn giản của bạ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
Từ những điều này, bạn có thể thấy hai điều: thứ nhất, mã giống nhau ở cả hai.
Thứ hai, bộ nhớ cho var được cấp phát bên ngoài vòng lặp:
subl $24, %esp
Và cuối cùng, điều duy nhất trong vòng lặp là việc gán và kiểm tra điều kiện:
L3:
movl $4, -12(%ebp)
L2:
cmpl $99, -16(%ebp)
jle L3
Điều này hiệu quả nhất có thể mà không cần loại bỏ hoàn toàn vòng lặp.