El estándar para el lenguaje de programación C ++ permite a los compiladores de este lenguaje aplicar cualquier transformación optimizadora [1] a un programa durante la compilación, siempre que tales optimizaciones no cambien el "comportamiento observable" del programa, como se especifica en el estándar; esto significa principalmente que cualquier acción que el programa realiza en su entorno ocurre en el orden especificado. Esta regla se conoce comúnmente como la regla como si . [2]
La regla tiene tres excepciones principales. La primera es que los programas que exhiben un comportamiento indefinido están exentos; dado que el comportamiento observable no está bien definido de todos modos, cualquier transformación es válida. Las otras dos excepciones se refieren a la copia de objetos y se denominan elisión de copia y optimización del valor de retorno .
El efecto de la regla como si depende de la implementación específica del compilador. Como ejemplo, en el compilador de Microsoft C ++ , provoca la omisión de ciertas optimizaciones, como el reordenamiento de instrucciones alrededor de llamadas a funciones de biblioteca , ya que tales llamadas pueden causar acciones de entrada / salida o accesos a ubicaciones de memoria marcadas como volátiles , y cambios en el orden de esas cambiar el comportamiento observable. [3]
La regla como si no es específica de C ++; muchos otros lenguajes de programación , incluidos C , Rust , Go , Ocaml , etc. tienen una regla similar para permitir la optimización (en particular, la alineación ).
Referencias
- ^ “¿Qué ha hecho mi compilador últimamente por mí? Desatornillar la tapa del compilador” Matt Godbolt CppCon2017 charla (septiembre 29o, 2017)
- ^ Regla como si sobre Cppreference , recuperada en abril de 2018
- ^ Brais, Hadi (mayo de 2015). "Compiladores: lo que todo programador debe saber acerca de las optimizaciones del compilador, parte 2" . Revista MSDN . Microsoft.