Üniversitede 8086 Meclisi yaptığımız günlerden hatırlıyorum, yapmanın daha başarılı olduğunu:
for (int i = 6; i > -1; i--)
Bir JNS işlemi olduğu için, bu da İşaret yoksa Atla anlamına gelir. Bunu kullanmak, her döngüden sonra karşılaştırma değerini almak için bellek araması olmadığı ve karşılaştırma da yapılmadığı anlamına geliyordu. Bugünlerde çoğu derleyici, yazmaç kullanımını optimize eder, böylece bellek meselesi artık önemli değildir, ancak yine de gerekli olmayan bir karşılaştırma elde edersiniz.
Bu arada, döngünüze 7 veya 6 koymak bir " sihirli sayı " demektir. Daha iyi okunabilirlik için, Niyet Gösteren Adı olan bir sabit kullanmalısınız. Bunun gibi:
const int NUMBER_OF_CARS = 7;
for (int i = 0; i < NUMBER_OF_CARS; i++)
DÜZENLEME: İnsanlar montaj işini almıyor, bu yüzden daha kapsamlı bir örnek açıkça gerekli:
(İ = 0; i <= 10; i ++) için yaparsak, bunu yapmanız gerekir:
mov esi, 0
loopStartLabel:
; Do some stuff
inc esi
; Note cmp command on next line
cmp esi, 10
jle exitLoopLabel
jmp loopStartLabel
exitLoopLabel:
(İnt i = 10; i> -1; i--) için yaparsak, bundan kurtulabilirsiniz:
mov esi, 10
loopStartLabel:
; Do some stuff
dec esi
; Note no cmp command on next line
jns exitLoopLabel
jmp loopStartLabel
exitLoopLabel:
Az önce kontrol ettim ve Microsoft'un C ++ derleyicisi bu optimizasyonu yapmıyor, ancak yaparsanız yapıyor:
for (int i = 10; i >= 0; i--)
Öyleyse ahlaki, Microsoft C ++ † kullanıyorsanız ve artan veya azalan bir fark yaratmazsa, hızlı bir döngü elde etmek için kullanmanız gereken:
for (int i = 10; i >= 0; i--)
bunlardan biri yerine:
for (int i = 10; i > -1; i--)
for (int i = 0; i <= 10; i++)
Ancak açıkçası "for (int i = 0; i <= 10; i ++)" okunabilirliğini elde etmek normalde bir işlemci komutunu kaçırmaktan çok daha önemlidir.
† Diğer derleyiciler farklı şeyler yapabilir.