ejemplo ligeramente diferente:
const int *global_ptr = 0;
void bar();
void foo() {
int x = 1;
global_ptr = &x;
bar();
std::cout << x << "\n";
}
El compilador no puede optimizar la última línea para utilizar el valor 1
, porque para todo lo que sabe, bar()
toma el valor de global_ptr
, lo convierte en int*
, y modifica x
a través eso. Esta sería una codificación algo arriesgada, pero descartar un calificador const y mutar es válido siempre que la referencia sea realmente mutable, por lo que el compilador debe permitirlo.
Pero, si x
fueron marcados const
entonces sería válido bar()
para desechar const y mutar, por lo que el optimizador es libre de asumir que x
todavía mantiene el valor 1
cuando se imprime.
Los optimizadores sin duda identifican las constantes de tiempo de compilación para este tipo de optimización, por lo que no me sorprendería ver que hace una diferencia para el código emitido. Cuánta diferencia hace en el rendimiento, no lo sé. No es difícil generar casos donde identificar una constante puede, por ejemplo, reemplazar una división (costosa) con algunos giros de bits más baratos, o puede permitir que expresiones que involucren x
y un montón de otras constantes se calculen en tiempo de compilación en lugar de tiempo de ejecución.
Además, la optimización en tiempo de enlace podría permitir bar
a ser inline, en cuyo caso el optimizador de tiempo de enlace puede inspeccionar su contenido más de cerca, y podría ser capaz de descartar su modificación x
incluso en el caso no constante.
En su ejemplo, sin embargo, ninguna referencia a colors
puede escapar a un código desconocido, por lo que la diferencia no aparece. De todos modos, una cadena const es probablemente más difícil de optimizar que const int, por lo que hay menos posibilidades de que estés habilitando alguna optimización brillante usando const
.
¿Llama a esta función con frecuencia? – Cameron
@Tommy: la cadena se copia a la devolución, ya que se devuelve por valor. – Cameron
@ Cameron: Whoops, por alguna razón, pensé que estaba devolviendo un puntero. –