C ++のvolatileキーワードはメモリフェンスを導入しますか?
volatile値が変更される可能性があることをコンパイラに通知することを理解していますが、この機能を実現するために、コンパイラはそれを機能させるためにメモリフェンスを導入する必要がありますか? 私の理解では、揮発性オブジェクトに対する一連の操作は並べ替えることができず、保持する必要があります。これは、いくつかのメモリフェンスが必要であり、これを回避する方法が実際にはないことを意味しているようです。私はこれを言うのは正しいですか? この関連する質問で興味深い議論があります ジョナサンウェイクリーは書いています: ...個別の揮発性変数へのアクセスは、それらが別々の完全な式で発生する限り、コンパイラーによって並べ替えることはできません...揮発性はスレッドセーフには役に立たないが、彼が与える理由ではありません。これは、コンパイラが揮発性オブジェクトへのアクセスを並べ替える可能性があるためではなく、CPUがそれらを並べ替える可能性があるためです。アトミック操作とメモリバリアにより、コンパイラとCPUの並べ替えが妨げられます これにデビッド・シュワルツ氏は返信コメントで: ... C ++標準の観点からは、コンパイラが何かを実行することと、コンパイラがハードウェアに何かを実行させる命令を発行することとの間に違いはありません。CPUが揮発性物質へのアクセスを並べ替える可能性がある場合、標準ではそれらの順序を保持する必要はありません。..。 ... C ++標準では、並べ替えの内容を区別していません。そして、CPUが観察可能な影響なしにそれらを並べ替えることができると主張することはできないので、それは問題ありません-C ++標準はそれらの順序を観察可能として定義しています。コンパイラーは、プラットフォームに標準が要求することを実行させるコードを生成する場合、プラットフォーム上のC ++標準に準拠しています。標準が揮発性物質へのアクセスを並べ替えないことを要求している場合、プラットフォームは揮発性物質を並べ替えることに準拠していません。..。 私のポイントは、C ++標準がコンパイラーによる個別の揮発性物質へのアクセスの並べ替えを禁止している場合、そのようなアクセスの順序はプログラムの観察可能な動作の一部であるという理論に基づいて、CPUが実行することを禁止するコードを発行することもコンパイラーに要求するということです。そう。この規格は、コンパイラーが行うことと、コンパイラーの生成コードがCPUに行うことを区別していません。 どちらが2つの質問をもたらします:どちらかが「正しい」ですか?実際の実装は実際に何をしますか?