"as-if"规则基本上定义了一个实现可以对合法的C++程序进行哪些转换。简而言之,所有不影响程序可观察行为的转换都是允许的。
至于“可观察行为”到底是什么意思,cppreference.com似乎与标准中给出的关于输入/输出的定义有所不同。我不确定那是否是标准的重新解释,或者是错误。
cppreference.com的"as-if"规则:
以下是一个示例。
正如所见,将店铺
至于“可观察行为”到底是什么意思,cppreference.com似乎与标准中给出的关于输入/输出的定义有所不同。我不确定那是否是标准的重新解释,或者是错误。
cppreference.com的"as-if"规则:
标准的"as-if"规则:
- 所有输入和输出操作按照原程序编写的顺序和内容发生。
这个差异对我很重要,因为我想知道普通店的重新排序是否是有效的编译器优化。根据cppreference的措辞,内存存储应属于其提到的“输出操作”。但根据标准,内存存储似乎不是“交互设备的输出动态”(反正交互设备是什么?)。
- 交互设备的输入和输出动态应以这样的方式进行,即在程序等待输入之前实际传递提示输出。什么构成交互式设备是由实现定义的。
以下是一个示例。
int A = 0;
int B = 0;
void foo()
{
A = B + 1; // (1)
B = 1; // (2)
}
现代编译器可能会生成以下代码,用于函数foo
:
mov 0x804a018, %eax
movl $0x1, 0x804a018 ; store 1 to B
add $0x1, %eax
mov %eax, 0x804a01c ; store 1 to A
ret
正如所见,将店铺
A
的重新排序与店铺 B
相匹配。这是否符合“似乎”规则?这种重新排序是否符合标准?