El punto más obvio donde const
es una optimización directa es al pasar argumentos a una función. A menudo es importante asegurarse de que la función no modifica los datos de modo que las únicas opciones reales para la firma de la función son los siguientes:
void f(Type dont_modify); // or
void f(Type const& dont_modify);
Por supuesto, la verdadera magia aquí está pasando una referencia en lugar de crear un (caro) copia del objeto. Pero si la referencia no estuviera marcada como const
, esto debilitaría la semántica de esta función y tendría efectos negativos (como dificultar el rastreo de errores). Por lo tanto, const
permite una optimización aquí.
/EDITAR: en realidad, un buen compilador puede analizar el flujo de control de la función, determinar que no modifique el argumento y hacer la optimización (pasando una referencia en lugar de una copia). const
aquí es meramente una ayuda para el compilador. Sin embargo, dado que C++ tiene una semántica bastante complicada y dicho análisis de flujo de control puede ser muy costoso para grandes funciones, probablemente no deberíamos confiar en los compiladores para esto. ¿Alguien tiene datos para respaldarme/probar que estoy equivocado?
/EDIT2: y sí, tan pronto como entran en juego los constructores de copia personalizada, se vuelve aún más complicado porque desafortunadamente los compiladores no pueden omitir llamarlos en esta situación.
¿significa que es ilegal eliminar la constness por 'const_cast' para cualquier cosa excepto los tipos primitivos o los objetos const con miembros mutables? –
@AndyT: Sí lo es. Se le permite 'const_cast' alejar la constness solo para los objetos que no son const en primer lugar. –
@AlexandreC. no puedes 'const_cast' alejar la consistencia de cualquier objeto. Pero intentar modificarlo es un comportamiento indefinido. El reparto en sí siempre está bien. – Simple