2

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」ルールに準拠していますか? この種の並べ替えは標準で許可されていますか?

4

2 に答える 2

3

cppreference.com が C++ 標準の実際のテキストと一致しない場合、cppreference.com は間違っています。標準のテキストに取って代わることができる唯一のものは、標準の新しいバージョンと、欠陥レポートの公式の解決策です(これは、「技術正誤表」と呼ばれるドキュメントにまとめられることがあります。標準)。

ただし、この場合、cppreference.com の「入出力操作」の意味を誤解しています。(メモリが機能する場合、そのテキストは古いバージョンの標準からそのまま取得されます。) メモリへのストアは出力操作ではありません。ファイルへの書き込みのみ(つまり、任意の出力ストリーム、stdio.hまたはiostreamその他の実装定義のメカニズム (Unix ファイル記述子など)) のみが、この規則の目的での出力としてカウントされます。

2011 年改訂以前の C および C++ 標準は、シングルスレッドの抽象マシンを想定していたため、ストアの順序付けについて何も指定していませんでした。C(++)11 では、新しいマルチスレッド仕様の一部として、ストアの順序付けに関する多数の規則が追加されました。

于 2014-08-14T00:17:20.103 に答える
2

as-if ルールの実際の表現は、標準の §1.9/8 にあります。

  • volatile オブジェクトへのアクセスは、抽象マシンの規則に従って厳密に評価されます。
  • プログラムの終了時に、ファイルに書き込まれたすべてのデータは、抽象セマンティクスに従ってプログラムを実行した場合に生成される可能性のある結果の 1 つと同一でなければなりません。
  • 対話型デバイスの入力と出力のダイナミクスは、プログラムが入力を待つ前にプロンプ​​ト出力が実際に配信されるような方法で行われます。対話型デバイスを構成するものは実装定義です。

Aとは揮発性ではないためB、この並べ替えは許可されます。

于 2014-08-14T00:14:49.707 に答える