「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
ご覧のように、ストア to はストア toA
で並べ替えられB
ます。「 as-if」ルールに準拠していますか? この種の並べ替えは標準で許可されていますか?