Tôi nhớ từ những ngày tôi làm hội 8086 ở trường đại học, việc này được thực hiện nhiều hơn:
for (int i = 6; i > -1; i--)
vì đã có một hoạt động JNS có nghĩa là Nhảy nếu không có Dấu hiệu. Sử dụng điều này có nghĩa là không có tra cứu bộ nhớ sau mỗi chu kỳ để có được giá trị so sánh và cũng không có so sánh. Ngày nay, hầu hết các trình biên dịch tối ưu hóa việc sử dụng đăng ký, do đó, bộ nhớ không còn quan trọng nữa, nhưng bạn vẫn nhận được một so sánh không bắt buộc.
Nhân tiện, đặt 7 hoặc 6 trong vòng lặp của bạn sẽ giới thiệu một " số ma thuật ". Để dễ đọc hơn, bạn nên sử dụng hằng số với Tên tiết lộ ý định. Như thế này:
const int NUMBER_OF_CARS = 7;
for (int i = 0; i < NUMBER_OF_CARS; i++)
EDIT: Mọi người không nhận được điều lắp ráp nên một ví dụ đầy đủ hơn rõ ràng là bắt buộc:
Nếu chúng tôi làm cho (i = 0; i <= 10; i ++), bạn cần làm điều này:
mov esi, 0
loopStartLabel:
; Do some stuff
inc esi
; Note cmp command on next line
cmp esi, 10
jle exitLoopLabel
jmp loopStartLabel
exitLoopLabel:
Nếu chúng ta làm cho (int i = 10; i> -1; i--) thì bạn có thể thoát khỏi điều này:
mov esi, 10
loopStartLabel:
; Do some stuff
dec esi
; Note no cmp command on next line
jns exitLoopLabel
jmp loopStartLabel
exitLoopLabel:
Tôi vừa kiểm tra và trình biên dịch C ++ của Microsoft không thực hiện tối ưu hóa này, nhưng nó thực hiện nếu bạn thực hiện:
for (int i = 10; i >= 0; i--)
Vì vậy, đạo đức là nếu bạn đang sử dụng Microsoft C ++, và tăng dần hoặc giảm dần không có sự khác biệt, để có được một vòng lặp nhanh, bạn nên sử dụng:
for (int i = 10; i >= 0; i--)
thay vì một trong hai:
for (int i = 10; i > -1; i--)
for (int i = 0; i <= 10; i++)
Nhưng thẳng thắn nhận được khả năng đọc "for (int i = 0; i <= 10; i ++)" thường quan trọng hơn nhiều so với việc thiếu một lệnh của bộ xử lý.
Trình biên dịch khác có thể làm những việc khác nhau.