我记得从大学时代开始做8086大会的那一天,我的表现更加出色:
for (int i = 6; i > -1; i--)
因为有一个JNS操作,表示如果没有符号则跳转。使用它意味着在每个周期之后都没有存储器查找来获得比较值,并且也没有比较。如今,大多数编译器都优化了寄存器的使用,因此存储不再重要,但是您仍然可以获得不需要的比较。
顺便说一句,将7或6放入循环中是引入一个“ 幻数 ”。为了获得更好的可读性,您应该使用带有Intent Revealing Name的常量。像这样:
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:
我刚刚检查了一下,Microsoft的C ++编译器没有进行此优化,但是如果您这样做,则可以:
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 ++)”的可读性通常比缺少一个处理器命令重要得多。
†其他编译器可能会做不同的事情。