Oui il peut.
La plupart des const
s sont purement pour le bénéfice du programmeur et n'aident pas le compilateur à optimiser car il est légal de les rejeter et ainsi ils ne disent rien d'utile au compilateur pour l'optimisation. Cependant, certains const
s ne peuvent pas être jetés (légalement) et ceux-ci fournissent au compilateur des informations utiles pour l'optimisation.
À titre d'exemple, l'accès à une variable globale définie avec un const
type peut être inséré alors qu'une variable sans const
type ne peut pas être insérée car elle peut changer au moment de l'exécution.
https://godbolt.org/g/UEX4NB
C ++:
int foo1 = 1;
const int foo2 = 2;
int get_foo1() {
return foo1;
}
int get_foo2() {
return foo2;
}
asm:
foo1:
.long 1
foo2:
.long 2
get_foo1():
push rbp
mov rbp, rsp
mov eax, DWORD PTR foo1[rip] ; foo1 must be accessed by address
pop rbp
ret
get_foo2():
push rbp
mov rbp, rsp
mov eax, 2 ; foo2 has been replaced with an immediate 2
pop rbp
ret
En termes pratiques, gardez à l'esprit que si cela const
peut améliorer les performances, dans la plupart des cas, ce ne sera pas le cas ou ce sera le cas, mais le changement ne sera pas perceptible. La principale utilité de const
n'est pas l'optimisation.
Steve Jessop donne un autre exemple dans son commentaire sur la question initiale qui soulève quelque chose qui mérite d'être mentionné. Dans une portée de bloc, il est possible pour un compilateur de déduire si une variable sera mutée et d'optimiser en conséquence, indépendamment de const
, car le compilateur peut voir toutes les utilisations de la variable. En revanche, dans l'exemple ci-dessus, il est impossible de prédire si foo1
sera muté car il pourrait être modifié dans d'autres unités de traduction. Je suppose qu'un ultra-compilateur sensible hypothétique pourrait analyser un programme entier et déterminer s'il est valide pour un accès en ligne à foo1
... mais les vrais compilateurs ne le peuvent pas.