Para el lenguaje de programación C++ , el estándar permite a los compiladores aplicar cualquier transformación de optimización [1] a un programa durante la compilación, siempre que dicha optimización no produzca cambios en el "comportamiento observable" del programa, tal como se especifica en el estándar. Esto significa principalmente que cualquier acción que el programa realice en su entorno se produce en el orden especificado. Esta regla se conoce comúnmente como la regla as-if [2] .
La regla tiene tres excepciones principales en las que se permiten optimizaciones que modifican el comportamiento. 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 as-if depende de la implementación específica del compilador. Por ejemplo, en el compilador Microsoft Visual C++ , provoca la omisión de ciertas optimizaciones, como la reordenación de instrucciones en torno a las llamadas a funciones de biblioteca , ya que dichas llamadas pueden provocar acciones de entrada/salida o accesos a ubicaciones de memoria marcadas como volátiles , y los cambios en el orden de esas acciones modifican el comportamiento observable. [3]
La regla as-if no es específica de C++. Muchos otros lenguajes de programación , incluidos C , Go , OCaml , Rust , etc., tienen una regla similar para permitir la optimización (en particular, la inserción en línea ).