“ as-if ”规则基本上定义了允许实现在合法 C++ 程序上执行的转换。简而言之,所有不影响程序可观察行为的转换都是允许的。
至于“可观察行为”究竟代表什么,cppreference.com似乎与标准给出的定义不同,关于 input/output。我不确定这是对标准的重新解释,还是错误。
cppreference.com 的“ as-if ”规则:
- 所有输入和输出操作都以相同的顺序和内容发生,就好像程序按照编写的方式执行一样。
标准的“ as-if ”规则:
- 交互式设备的输入和输出动态应该以这样一种方式发生,即在程序等待输入之前实际交付提示输出。什么构成交互式设备是实现定义的
这种差异对我来说很重要,因为我想知道正常的商店重新排序是否是有效的编译器优化。根据 cppreference 的措辞,内存存储应该属于output operations
它所提到的。但根据标准,内存存储似乎不是the output dynamics of interactive devices
. (到底什么是交互式设备?)
一个可以效仿的例子。
int A = 0;
int B = 0;
void foo()
{
A = B + 1; // (1)
B = 1; // (2)
}
现代编译器可能会为 function生成以下代码foo
:
mov 0x804a018, %eax
movl $0x1, 0x804a018 ; store 1 to B
add $0x1, %eax
mov %eax, 0x804a01c ; store 1 to A
ret
如所见, store toA
与 store to 一起重新排序B
。它是否符合“ as-if ”规则?标准是否允许这种重新排序?