Pamiętam z moich czasów, kiedy robiliśmy 8086 Assembly na uczelni, było bardziej wydajne do zrobienia:
for (int i = 6; i > -1; i--)
ponieważ była operacja JNS , która oznacza skok, jeśli nie ma znaku. Użycie tego oznaczało, że po każdym cyklu nie było przeszukiwania pamięci, aby uzyskać wartość porównawczą, ani porównania. Obecnie większość kompilatorów optymalizuje użycie rejestrów, więc kwestia pamięci nie jest już ważna, ale nadal uzyskuje się niepotrzebne porównanie.
Nawiasem mówiąc, wstawienie 7 lub 6 do pętli wprowadza „ magiczną liczbę ”. Dla lepszej czytelności powinieneś używać stałej z nazwą ujawniającą intencję. Lubię to:
const int NUMBER_OF_CARS = 7;
for (int i = 0; i < NUMBER_OF_CARS; i++)
EDYCJA: Ludzie nie rozumieją kwestii montażu, więc oczywiście wymagany jest pełniejszy przykład:
Jeśli zrobimy dla (i = 0; i <= 10; i ++), musisz to zrobić:
mov esi, 0
loopStartLabel:
; Do some stuff
inc esi
; Note cmp command on next line
cmp esi, 10
jle exitLoopLabel
jmp loopStartLabel
exitLoopLabel:
Jeśli zrobimy dla (int i = 10; i> -1; i--), to możesz uciec z tego:
mov esi, 10
loopStartLabel:
; Do some stuff
dec esi
; Note no cmp command on next line
jns exitLoopLabel
jmp loopStartLabel
exitLoopLabel:
Właśnie sprawdziłem i kompilator C ++ firmy Microsoft nie wykonuje tej optymalizacji, ale robi to, jeśli:
for (int i = 10; i >= 0; i--)
Więc morał jest taki, że jeśli używasz Microsoft C ++ †, a rosnąco lub malejąco nie robi różnicy, aby uzyskać szybką pętlę, powinieneś użyć:
for (int i = 10; i >= 0; i--)
zamiast któregokolwiek z tych:
for (int i = 10; i > -1; i--)
for (int i = 0; i <= 10; i++)
Ale szczerze mówiąc, uzyskanie czytelności „for (int i = 0; i <= 10; i ++)” jest zwykle znacznie ważniejsze niż brak jednego polecenia procesora.
† Inne kompilatory mogą robić różne rzeczy.