const
no ayuda al optimizador.
Desde const
se puede lanzar lejos con const_cast
, es posible escribir programas que utilizan const
en varios lugares, y luego desecharla y modificar las variables de todos modos, con el comportamiento definido de acuerdo a la norma. Por lo tanto, el compilador debe ver el código real del programa para determinar qué variables se modifican y, de todos modos, es bastante bueno (por ejemplo, puede determinar que una variable no const sea invariante sobre un determinado bloque de código y optimizar en consecuencia)
Si el compilador trató ciegamente const
como garantía de que algo no cambiará, el optimizador podría romper algunos programas bien formados.
const
es una característica de tiempo de compilación para ayudar a los programadores a escribir el código correcto, agregando algunas restricciones de tiempo de compilación e indicando un contrato de código (por ejemplo, 'Prometo no cambiar este parámetro'). No tiene nada que ver con la optimización. Si bien las invariantes son importantes para los optimizadores, esto no tiene nada que ver con la palabra clave const
.
Existe una excepción: objetos declarados con const
. Estos no pueden ser modificados; incluso si son a través del casting, el comportamiento no está definido. Hay un poco de sutileza aquí:
const int ci = 5;
const_cast<int&>(ci) = 5; // undefined behavior, original object declared const
int i = 5;
const int& ci2 = i; // cannot modify i through ci2, const reference
const_cast<int&>(ci2) = 5; // OK, original object not declared const
Así que cuando el compilador ve const int ci
probablemente hace suponer que nunca, nunca cambiar, porque la modificación es un comportamiento indefinido. Sin embargo, es probable que este no sea el cuello de botella en su programa, es solo un #define
más sofisticado. Aparte de eso, const
es débil, solo una palabra clave para el sistema de tipos.
Eso dependería del optimizador, ¿o no? – dmckee