Sí, puede.
La mayoría de los const
s son puramente para el beneficio del programador y no ayudan al compilador a optimizar porque es legal descartarlos y por lo tanto no le dicen al compilador nada útil para la optimización. Sin embargo, algunos const
s no pueden descartarse (legalmente) y proporcionan al compilador información útil para la optimización.
Como ejemplo, el acceso a una variable global definida con un tipo const
puede estar en línea, mientras que uno sin un tipo const
no puede incluirse porque podría cambiar en tiempo de ejecución.
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 términos prácticos, tenga en cuenta que si bien const
puede mejorar el rendimiento, en la mayoría de los casos no lo hará o lo hará, pero el cambio no será notable. La utilidad principal de const
no es la optimización.
Steve Jessop da otro ejemplo en su comentario sobre la pregunta original que menciona algo que vale la pena mencionar. En un ámbito de bloque, es posible que un compilador pueda deducir si una variable se mutará y se optimizará en consecuencia, independientemente de const
, porque el compilador puede ver todos los usos de la variable. Por el contrario, en el ejemplo anterior, es imposible predecir si se mutará foo1
, ya que podría modificarse en otras unidades de traducción. Supongo que un hipotético compilador ultrasensible podría analizar un programa completo y determinar si es válido para acceder en línea al foo1
... pero los compiladores reales no pueden.
Const-correctness es una de las mejores prácticas en cuanto a la capacidad de mantenimiento. Si su código C++ no es const-correcto, es básicamente una pila de basura, esperando que ocurra un desastre. No tiene la intención de afectar el rendimiento. –
@Neil Butterworth: desafortunadamente lo inverso no es verdad. – Beta
Aquí hay un ejemplo donde 'const' hizo una diferencia de rendimiento: http://stackoverflow.com/questions/1121791/optimisation-of-division-in-gcc. Sin embargo, fue esencialmente un problema de calidad de implementación. 'const' no determinó si el compilador * podría * legalmente hacer la optimización, simplemente sucedió que la versión del compilador no pudo hacerlo cuando faltaba. –