c++ - 理解 as-if 规则, "the program was executed as written"

标签 c++ compiler-optimization

我正在尝试理解 as-if 规则。根据cppreference :

The as-if rule
Allows any and all code transformations that do not change the observable behavior of the program

Explanation
The C++ compiler is permitted to perform any changes to the program as long as the following remains true: [...]

解释部分的第二个技巧我很难理解:

2) At program termination, data written to files is exactly as if the program was executed as written.

我只是不明白“程序按书面执行”是什么意思。

最佳答案

周一,您的老板走进您的办公室,说“我需要在周四之前将 A 文件放在我的办公 table 上,并在周五将 B 放在我的办公 table 上”。他首先在文件 A 中描述了他想要的东西以及他认为您应该如何做这些事情,然后在文件 B 中描述了他想要的东西。

在你老板的心目中,你首先要为文件 A 做事,在星期四将该文件放在他的办公 table 上,然后开始处理文件 B,并在星期五完成。但是您意识到,更早开始处理文件 B 会更有意义——甚至在文件 A 之前。没有理由你的老板必须知道——他关心的只是周四收到 A 和周五收到 B。您还意识到他建议的方式可以改进,因此您采用稍微不同的方法来生成所需的信息。

在这个类比中,老板是一些 C++ 代码,而你是编译器。只要可观察的行为(将文件放在老板的 table 上)相同,编译器重新排列操作(以另一种顺序处理文件)是合法的。同样,编译器可以自由地对保留可观察行为的代码进行任何转换(使用与老板描述的方法不同的方法)。

特别是,“就好像程序按照书面执行一样”意味着“就好像您完全按照老板的指示完成了工作”(即使您做了不同的事情)。

关于c++ - 理解 as-if 规则, "the program was executed as written",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56802645/

相关文章:

c++ - 使用 goto 干净地退出循环

c++ - 我可以在下面的代码中使用任何编译器标志来报告有关 UB 的警告吗?

c++ - 为什么现代 C++ 编译器不优化这样的简单循环? (Clang,MSVC)

c++ - 主线程退出后线程访问共享变量

performance - 'optimise' scala 编译器标志有什么作用?

c++ - constexpr 说明符性能不符合我在 C++ 中的预期

gcc - 为什么常见的 C 编译器在输出中包含源文件名?

c++ - 如何从 C++ 而不是虚幻编辑器添加静态网格物体组件的值?

c++ - operator+ 和 operator= 如何一起使用?

c++ - 这个递归阶乘实现有什么问题?