ทั้งคู่เหมือนกันและนี่คือวิธีที่คุณสามารถค้นหาได้โดยดูว่าคอมไพเลอร์ทำอะไร (แม้ว่าจะไม่ได้ตั้งค่าการเพิ่มประสิทธิภาพไว้ที่สูงก็ตาม):
ดูว่าคอมไพเลอร์ (gcc 4.0) ทำอะไรกับตัวอย่างง่ายๆของคุณ:
1.c:
main(){ int var; while(int i < 100) { var = 4; } }
gcc -S 1.c
1. วินาที:
_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. ค
main() { while(int i < 100) { int var = 4; } }
gcc -S 2.c
2. วินาที:
_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
ซึ่งมีประสิทธิภาพมากที่สุดเท่าที่คุณจะทำได้โดยไม่ต้องถอดลูปออกทั้งหมด