Я помню, как в те дни, когда мы делали 8086 Ассамблею в колледже, это было более продуктивно:
for (int i = 6; i > -1; i--)
, поскольку была операция JNS , которая означает Прыжок, если нет знака. Использование этого означало, что после каждого цикла не было никакого поиска памяти для получения значения сравнения, а также никакого сравнения. В настоящее время большинство компиляторов оптимизируют использование регистров, поэтому память больше не важна, но вы все равно получаете ненужное сравнение.
Между прочим, введение в цикл 7 или 6 вводит " магическое число ". Для лучшей читаемости вы должны использовать константу с намеренным раскрывающим именем. Как это:
const int NUMBER_OF_CARS = 7;
for (int i = 0; i < NUMBER_OF_CARS; i++)
РЕДАКТИРОВАТЬ: Люди не получают сборку, так что требуется более полный пример:
Если мы делаем для (i = 0; i <= 10; i ++), вам нужно сделать это: </p>
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 ++)» обычно гораздо важнее, чем пропустить одну команду процессора. </p>
† Другие компиляторы могут делать разные вещи.