ฉันจำได้ว่าตั้งแต่สมัยที่เราทำ 8086 Assembly ที่วิทยาลัยมันเป็นเรื่องที่ต้องทำมากกว่า:
for (int i = 6; i > -1; i--)
เนื่องจากมีการดำเนินการJNSซึ่งหมายถึง Jump if No Sign การใช้สิ่งนี้หมายความว่าไม่มีการค้นหาหน่วยความจำหลังจากแต่ละรอบเพื่อให้ได้ค่าเปรียบเทียบและไม่มีการเปรียบเทียบ ทุกวันนี้คอมไพเลอร์ส่วนใหญ่ปรับการใช้งานรีจิสเตอร์ให้เหมาะสมเพื่อให้หน่วยความจำไม่สำคัญอีกต่อไป แต่คุณยังคงได้รับการเปรียบเทียบที่ไม่จำเป็น
วิธีการใส่ 7 หรือ 6 ในลูปของคุณคือการแนะนำ " หมายเลขวิเศษ " เพื่อให้อ่านง่ายขึ้นคุณควรใช้ค่าคงที่กับชื่อเปิดเผยเจตนา แบบนี้:
const int NUMBER_OF_CARS = 7;
for (int i = 0; i < NUMBER_OF_CARS; i++)
แก้ไข: ผู้คนไม่ได้รับสิ่งที่ประกอบดังนั้นจึงจำเป็นต้องมีตัวอย่างที่สมบูรณ์กว่า:
ถ้าเราทำเพื่อ (i = 0; i <= 10; i ++) คุณต้องทำสิ่งนี้:
mov esi, 0
loopStartLabel:
; Do some stuff
inc esi
; Note cmp command on next line
cmp esi, 10
jle exitLoopLabel
jmp loopStartLabel
exitLoopLabel:
ถ้าเราทำเพื่อ (int i = 10; i> -1; i--) คุณจะได้รับสิ่งนี้:
mov esi, 10
loopStartLabel:
; Do some stuff
dec esi
; Note no cmp command on next line
jns exitLoopLabel
jmp loopStartLabel
exitLoopLabel:
ฉันเพิ่งตรวจสอบและคอมไพเลอร์ C ++ ของ Microsoft ไม่ได้ทำการเพิ่มประสิทธิภาพนี้ แต่จะทำหากคุณทำ:
for (int i = 10; i >= 0; i--)
ดังนั้นคุณธรรมคือถ้าคุณใช้ Microsoft C ++ †และการขึ้นหรือลงจะไม่แตกต่างกันเพื่อให้ได้ลูปอย่างรวดเร็วคุณควรใช้:
for (int i = 10; i >= 0; i--)
แทนที่จะเป็นอย่างใดอย่างหนึ่งต่อไปนี้:
for (int i = 10; i > -1; i--)
for (int i = 0; i <= 10; i++)
แต่การได้รับความสามารถในการอ่าน "for (int i = 0; i <= 10; i ++)" อย่างตรงไปตรงมานั้นมีความสำคัญมากกว่าคำสั่งตัวประมวลผลที่ขาดหายไป
†คอมไพเลอร์อื่น ๆ อาจทำสิ่งที่แตกต่างกัน