Saya ingat dari hari-hari saya ketika kami melakukan Majelis 8086 di kampus, itu lebih baik dilakukan:
for (int i = 6; i > -1; i--)
karena ada operasi JNS yang berarti Langsung jika Tidak Ada Tanda. Menggunakan ini berarti bahwa tidak ada pencarian memori setelah setiap siklus untuk mendapatkan nilai perbandingan dan tidak ada perbandingan. Saat ini sebagian besar kompiler mengoptimalkan penggunaan register sehingga hal memori tidak lagi penting, tetapi Anda masih mendapatkan perbandingan yang tidak diperlukan.
By the way menempatkan 7 atau 6 di lingkaran Anda memperkenalkan " angka ajaib ". Untuk keterbacaan yang lebih baik, Anda harus menggunakan konstanta dengan Nama Pengungkapan Intent. Seperti ini:
const int NUMBER_OF_CARS = 7;
for (int i = 0; i < NUMBER_OF_CARS; i++)
EDIT: Orang-orang tidak mendapatkan hal perakitan sehingga jelas diperlukan contoh yang lebih lengkap:
Jika kita lakukan untuk (i = 0; i <= 10; i ++) Anda perlu melakukan ini:
mov esi, 0
loopStartLabel:
; Do some stuff
inc esi
; Note cmp command on next line
cmp esi, 10
jle exitLoopLabel
jmp loopStartLabel
exitLoopLabel:
Jika kita lakukan untuk (int i = 10; i> -1; i--) maka Anda bisa lolos dengan ini:
mov esi, 10
loopStartLabel:
; Do some stuff
dec esi
; Note no cmp command on next line
jns exitLoopLabel
jmp loopStartLabel
exitLoopLabel:
Saya baru saja memeriksa dan kompiler C ++ Microsoft tidak melakukan optimasi ini, tetapi ia melakukannya jika Anda melakukannya:
for (int i = 10; i >= 0; i--)
Jadi moralnya adalah jika Anda menggunakan Microsoft C ++ †, dan naik atau turun tidak ada bedanya, untuk mendapatkan perulangan cepat Anda harus menggunakan:
for (int i = 10; i >= 0; i--)
daripada salah satu dari ini:
for (int i = 10; i > -1; i--)
for (int i = 0; i <= 10; i++)
Tapi terus terang mendapatkan keterbacaan "untuk (int i = 0; i <= 10; i ++)" biasanya jauh lebih penting daripada melewatkan satu perintah prosesor.
† Kompiler lain dapat melakukan hal yang berbeda.