For the programming language C++, the standard allows compilers to apply any optimizing[1] transformation to a program during compiling, provided that such optimization makes no change in the "observable behavior" of the program, as specified in the standard. This mostly means that any actions the program performs on its environment occur in the specified order. This rule is commonly referred to as the as-if rule.[2]
The rule has three main exceptions in which behavior-changing optimizations are permitted. The first is that programs exhibiting undefined behavior are exempt; since the observable behavior is not well-defined anyway, any transformation is valid. The other two exceptions concern the copying of objects, and are called copy elision and the return value optimization.
The effect of the as-if rule depends on the specific compiler implementation. As an example, in the Microsoft Visual C++ compiler, it causes omission of certain optimizations such as instruction reordering around calls to library functions, since such calls may cause input/output actions or accesses to memory locations marked volatile, and changes in the order of those change observable behavior.[3]
The as-if rule is not specific to C++. Many other programming languages, including C, Go, OCaml, Rust, etc. have a similar rule, to permit optimization (notably inlining).
References
[edit]- ^ Godbolt, Matt (September 29, 2017). What Has My Compiler Done for Me Lately? Unbolting the Compiler's Lid. CppCon2017.
- ^ As-if rule on Cppreference, retrieved in April 2018
- ^ Brais, Hadi (May 2015). Compilers: What Every Programmer Should Know About Compiler Optimizations, Part 2. MSDN Magazine (Report). Microsoft.