Я помню, как в те дни, когда мы делали сборку 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++)
EDIT: люди не получают сборку, поэтому, очевидно, требуется более полный пример:
Если мы делаем для (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 ++)" обычно гораздо важнее, чем пропуск одной команды процессора.
† Другие компиляторы могут делать разные вещи.