void Animation::playAnimation() const
{
static const int index = 0;
const std::string& animationFileName =
m_animationContainer.getAnimationName(index);
static const int zOrder = -1;
static bool isLooping = false;
AnimationBank::play(animationFileName,
zOrder,
isLooping);
}
¿Hay algún beneficio para definir variables locales constantes como static
? O es innecesario e incluso una mala práctica.
Respuestas:
Más allá de la muy buena respuesta de @ Christophe, el código generado para la estática es probablemente peor que el de la variable local, por lo que si está interesado en el beneficio oculto, las estadísticas son peores en los procesadores modernos.
La razón es que las estadísticas deben ubicarse en algún lugar de la memoria que puedan encontrar todos los otros subprocesos y todas las demás invocaciones. Esto básicamente significa ponerlos en la memoria global.
A lo largo de los años, los procesadores y compiladores juntos han optimizado significativamente el acceso a las variables locales debido a la popularidad de su uso, en comparación con otras variables, como los globales, las estadísticas y los campos. El compilador puede optar por almacenar una variable local en un registro de CPU, e incluso si no lo hace (por lo que utiliza la pila de invocación) toda la pila está casi seguramente en la memoria caché. Acceder a la pila suele ser un modo de direccionamiento de desplazamiento corto (fuera del registro del puntero de la pila). Sin embargo, el acceso a las variables globales o estáticas generalmente requiere un desplazamiento extendido o una dirección absoluta, por lo que las instrucciones resultantes son más largas que su equivalente para el acceso a la memoria de la pila.
Dicho todo esto, debido a la combinación de static y const, el compilador puede detectar que puede sustituir el valor constante en el punto de uso, por lo que quizás el uso de const mitiga lo anterior. Aún así, su fragmento muestra al menos una estadística no constante, por lo que tal vez la discusión sea de actualidad.
fuente
No se trata de beneficios, sino de semántica:
Una variable estática en una función (incluso una función miembro) significa que la variable se comparte entre todas las llamadas de esa función. Entonces, una llamada de esa función tiene un efecto secundario en las llamadas posteriores.
Una variable no estática es exclusiva de cada ejecución de la función.
Entonces, a menos que sea necesario por alguna razón específica y bien justificada, mantenga las variables locales no estáticas.
Observación adicional: la variable estática también se comparte entre diferentes subprocesos. Por lo tanto, llamar a esta función desde más de un hilo a la vez puede dar lugar a condiciones de carrera y UB (incluso si se requieren diferentes objetos).
fuente
const
, el optimizador lo propagará de todos modos, ya seastatic
o no. Pero todavía hay una sutil diferencia: como señaló, el inicializador de objetos podría usar algunos efectos secundarios, por lo que elegir estática o no podría distorsionar el comportamiento esperado. Por todas estas razones, aún sugeriría usarlostatic
si y solo siconst
es realmente algo que está intrínsecamente vinculado a la clase. Muestre la intención en el código y deje que el optimizador haga su trabajo.Una variable local se inicializa o construye cada vez que se llama a la función. Las variables locales se almacenan en la pila y, por lo tanto, generalmente son seguras para subprocesos.
Una variable local estática se inicializa o construye solo una vez; la primera vez que se llama a la función Las variables estáticas locales no se almacenan en la pila y, por lo tanto, generalmente no son seguras para subprocesos.
Una variable local constante es una variable que no cambia y se inicializa o construye cada vez que se llama a la función. Las variables locales constantes se almacenan en la pila y, por lo tanto, generalmente son seguras para subprocesos.
Una variable local const estática es una variable que no cambia y se inicializa o construye solo una vez; la primera vez que se llama a la función Las variables const estáticas locales no se almacenan en la pila y, por lo tanto, generalmente no son seguras para subprocesos.
Los compiladores pueden optimizar las variables constantes en una constante de tiempo de compilación.
Los compiladores pueden optimizar las variables no estáticas manteniéndolas en registros en lugar de en la pila.
fuente
static const
variables locales no serían seguras para subprocesos? Su valor es constante incluso si su valor se encuentra en el hep.static const
variable.