Je me souviens de l'époque où nous faisions de l'assemblage 8086 à l'université, c'était plus performant :
for (int i = 6; i > -1; i--)
comme il y avait un JNS opération qui signifie Sauter si pas de signe. En utilisant cette méthode, il n'y avait pas de recherche en mémoire après chaque cycle pour obtenir la valeur de comparaison et pas de comparaison non plus. De nos jours, la plupart des compilateurs optimisent l'utilisation des registres, de sorte que l'aspect mémoire n'est plus important, mais vous obtenez toujours une comparaison non requise.
Au fait, mettre 7 ou 6 dans votre boucle, c'est introduire un " nombre magique ". Pour une meilleure lisibilité, vous devez utiliser une constante avec un nom révélant l'intention. Comme ceci :
const int NUMBER_OF_CARS = 7;
for (int i = 0; i < NUMBER_OF_CARS; i++)
EDIT : Les gens ne comprennent pas le concept d'assemblage, donc un exemple plus complet est évidemment nécessaire :
Si nous faisons for (i = 0 ; i <= 10 ; i++) vous devez faire ceci :
mov esi, 0
loopStartLabel:
; Do some stuff
inc esi
; Note cmp command on next line
cmp esi, 10
jle exitLoopLabel
jmp loopStartLabel
exitLoopLabel:
Si nous faisons for (int i = 10 ; i > -1 ; i--) alors vous pouvez vous en sortir :
mov esi, 10
loopStartLabel:
; Do some stuff
dec esi
; Note no cmp command on next line
jns exitLoopLabel
jmp loopStartLabel
exitLoopLabel:
Je viens de vérifier et le compilateur C++ de Microsoft ne fait pas cette optimisation, mais il le fait si vous le faites :
for (int i = 10; i >= 0; i--)
La morale est donc que si vous utilisez Microsoft C++†, et que l'ascendant ou le descendant ne fait aucune différence, pour obtenir une boucle rapide, vous devriez utiliser :
for (int i = 10; i >= 0; i--)
plutôt que l'un ou l'autre :
for (int i = 10; i > -1; i--)
for (int i = 0; i <= 10; i++)
Mais franchement, obtenir la lisibilité de "for (int i = 0 ; i <= 10 ; i++)" est normalement bien plus important que de manquer une commande du processeur.
† D'autres compilateurs peuvent faire des choses différentes.