Explicación abstracta
Tanto C como C ++ tienen un concepto de máquina abstracta . Cuando el código usa el valor de alguna variable, la máquina abstracta dice que la implementación tiene que acceder al valor de esa variable. El código del formulario statement_A; statement_B; statement_C;
debe ejecutarse exactamente en el orden especificado. Las expresiones comunes a esas tres declaraciones deben ser recalculadas cada vez que ocurren.
Según las máquinas abstractas, dada la secuencia de enunciados statement_A; statement_B; statement_C;
, la implementación debe realizarse primero statement_A
en su totalidad, luego statement_B
, y finalmente statement_C
. La implementación no puede recordar que asignó age
el valor de 5. Cada declaración que hace referencia age
debe acceder al valor de esa variable.
No habría necesidad de la volatile
palabra clave si las implementaciones ejecutaran estrictamente el código C o C ++ según las especificaciones de la máquina abstracta. Las máquinas abstractas C y C ++ no tienen un concepto de registros, ningún concepto de subexpresiones comunes, y el orden de ejecución es estricto.
Ambos idiomas también tienen reglas como si . Una implementación cumple con el estándar siempre que esa implementación se comporte como si hubiera ejecutado cosas según la especificación de máquina abstracta. El compilador puede asumir que las variables no volátiles no cambian los valores entre asignaciones. Mientras no rompa la as-if
regla, la secuencia statement_A; statement_B; statement_C;
podría implementarse ejecutando parte de statement_C
, luego parte de statement_A
, luego todo statement_B
, luego el resto statement_A
y finalmente el resto statement_C
.
Esas reglas como si no se aplican a las volatile
variables. Con respecto a las volatile
variables y funciones, una implementación tiene que hacer exactamente lo que le dijo que hiciera, y exactamente en el orden en que le dijo que hiciera las cosas.
Hay una desventaja en la especificación de la máquina abstracta: es lenta. Un aspecto positivo de C y C ++ en comparación con otros lenguajes es que son bastante rápidos. Este no sería el caso si el código se ejecutara por estas máquinas abstractas. Las reglas as-if son las que permiten que C y C ++ sean tan rápidos.
Respuesta ELI5
¿Qué significa cuando el compilador no "optimiza" la dirección de memoria?
"Optimizar" una dirección de memoria es un concepto avanzado, algo que no está dentro del alcance de las capacidades de un niño de cinco años. Los niños de cinco años que cumplen con las normas harán exactamente lo que usted les diga, ni más ni menos. Con volatile
, le está diciendo a la implementación que actúe como si fueran cinco: sin pensar, sin optimizaciones elegantes. En cambio, la implementación tiene que hacer exactamente lo que el código le dice que haga.
volatile
variable y dice 5, y la vuelve a leer el próximo año, tiene garantizado que obtendrá 6.