As-if rule

From HandWiki

The standard for the C++ programming language allows compilers for this language to apply any optimizing[1] transformation to a program during compilation, provided that such optimizations make 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 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, Rust, Go, Ocaml, etc. have a similar rule, to permit optimization (notably inlining).

References

  1. “What Has My Compiler Done for Me Lately? Unbolting the Compiler's Lid” Matt Godbolt CppCon2017 talk (September 29th, 2017)
  2. As-if rule on Cppreference, retrieved in April 2018
  3. Brais, Hadi (May 2015). "Compilers – What Every Programmer Should Know About Compiler Optimizations, Part 2". Microsoft. https://msdn.microsoft.com/en-us/magazine/dn973015.aspx.