c++ performance optimization const compiler-optimization

c++ - ¿Debo usar const para las variables locales para una mejor optimización del código?



performance optimization (3)

A menudo uso const para variables locales que no se modifican, como esta:

const float height = person.getHeight();

Creo que puede hacer que el código compilado sea potencialmente más rápido, lo que permite al compilador hacer algo más de optimización. ¿O estoy equivocado, y los compiladores pueden darse cuenta de que la variable local nunca se modifica?


¿O estoy equivocado, y los compiladores pueden darse cuenta de que la variable local nunca se modifica?

La mayoría de los compiladores son lo suficientemente inteligentes como para resolver esto por sí mismos.
Debería usar const para garantizar la corrección de const y no para la micro-optimización.
la corrección const permite que el compilador lo ayude a evitar cometer errores honestos, por lo que debe usar const siempre que sea posible, pero por razones de mantenimiento y evitar cometer errores estúpidos .

Es bueno entender las implicaciones de rendimiento del código que escribimos, pero se debe evitar la micro optimización excesiva. Con respecto al rendimiento uno debe seguir el,

Regla 80-20:

Identifique el 20% de su código que usa el 80% de sus recursos, a través de perfiles en conjuntos de datos representativos y solo luego intente optimizar esos cuellos de botella.


Esta diferencia en el rendimiento casi seguramente será insignificante, sin embargo, debe usar const siempre que sea posible por razones de documentación del código. Muchas veces, los compiladores pueden resolver esto de todos modos y realizar las optimizaciones de forma automática. const es realmente más sobre la legibilidad del código y la claridad que el rendimiento.


No creo que sea una buena práctica hacer que las variables locales, incluidos los parámetros de funciones, sean constantes por defecto.

La razón principal es la brevedad. Las buenas prácticas de codificación le permiten hacer que su código sea breve, pero este no.

Del mismo modo, puede escribir void foo(void) en sus declaraciones de funciones, y puede justificarlo mediante una mayor claridad, ser explícito acerca de no tener la intención de pasar un parámetro a la función, etc., pero es esencialmente una pérdida de espacio, y con el tiempo casi perdió el uso. Creo que lo mismo sucederá con la tendencia de usar const todas partes.

Marcar variables locales con un calificador const no es muy útil para la mayoría de los colaboradores que trabajan con el código que usted crea. A diferencia de los miembros de la clase, las variables globales o los datos apuntados a a por un puntero, una variable local no tiene ningún efecto externo y nadie estará restringido por el calificador de la variable local o aprenderá algo útil de ella (a menos él va a cambiar la función particular donde está la variable local).

Si necesita cambiar su función, la tarea normalmente no debería requerir que trate de deducir información valiosa del calificador constante de una variable allí. La función no debe ser tan grande o difícil de entender; si es así, probablemente tenga problemas más serios con su diseño, considere refactorizar. Una excepción son las funciones que implementan algunos cálculos de matemáticas difíciles, pero para aquellos que necesita poner algunos detalles o un enlace al papel en sus comentarios.

Puede preguntar por qué aún no coloca el calificador const si no le cuesta mucho esfuerzo . Desafortunadamente, lo hace. Si tuviera que poner todos los calificadores const, lo más probable es que tenga que pasar por mi función después de que haya terminado y poner los calificadores en su lugar, una pérdida de tiempo. El motivo es que no tiene que planificar cuidadosamente el uso de las variables locales, a diferencia de los miembros o los datos apuntados por los punteros.

En su mayoría, se trata de una herramienta de conveniencia, técnicamente, la mayoría de ellos se pueden evitar al factorizarlos en expresiones o reutilizar variables. Entonces, dado que son una herramienta de conveniencia, la mera existencia de una variable local particular es simplemente una cuestión de gusto.

Particularmente, puedo escribir:

  • int d = foo(b) + c;
  • const int a = foo(b); int d = a + c;
  • int a = foo(b); a += c

Cada una de las variantes es idéntica en todos los aspectos, excepto que la variable a es constante o no, o no existe en absoluto. Es difícil comprometerse con algunas de las opciones temprano.