揮発性 (C++)

オブジェクトは、ハードウェアでプログラムで変更される場合があることを宣言するために使用できる型修飾子。

volatile declarator ;

解説

コンパイラがこのキーワードを解釈する方法を指定するには [/volatile] のコンパイラ スイッチを使用できます。

Visual Studio は、ターゲット アーキテクチャによって volatile のキーワードが異なって解釈します。ARM の場合、/volatile のコンパイラ オプションが指定されていない場合、コンパイラは /volatile:iso が指定されたものとして実行します。ARM 以外のアーキテクチャについては、/volatile のコンパイラ オプションが指定されていない場合、コンパイラは /volatile:ms が指定されたものとして実行します; したがって、ARM 以外の場合、アーキテクチャは、スレッド間で共有されるメモリを処理するとき /volatile:isoを指定する推奨し、明示的な同期プリミティブとコンパイラ組み込み関数を使用します。

割り込みハンドラーなどの非同期プロセスによって使用されるメモリ位置にアクセスするために volatile の修飾子を使用できます。

volatile も __restrict のキーワードを持つ変数で使用すると、volatile が優先されます。

struct のメンバーが volatileとしてマークされている場合、volatile は、構造体全体にに反映されます。構造体に現在のアーキテクチャに 1 個の命令を使用してコピーできる長さである volatile はその構造に完全に失われることがあります。

volatile のキーワードは、次の条件の 1 つが当てはまる場合、フィールドには影響ありません。可能性があります:

  • volatile フィールドの長さは、現在のアーキテクチャに 1 個の命令を使用してコピーできる最大サイズを超えています。

  • 最も外側のコンテナー structの長さは、またはでは、入れ子になった場合 structのメンバーである場合、現在のアーキテクチャに 1 個の命令を使用してコピーできる最大サイズを超えています。

プロセッサが非キャッシュ可能なメモリ アクセスの順序を変更しませんが、非キャッシュ可能な変数は volatile としてコンパイラがメモリ アクセスの順序を変更しないことを保証するためにマークする必要があります。

値がいつでも変更可能であるため、volatile として宣言されるオブジェクトは、特定の最適化では使用されません。システムは、前の命令が同じオブジェクトの値を要求していても、要求されたときに volatile オブジェクトの現在の値を常に読み取ります。また、オブジェクトの値は、代入ですぐに書き込まれます。

準拠の ISO

Visual C++ の以前のバージョンの volatile 動作を持つ [C# volatile] のキーワード、または不明に慣れている場合は、/volatile:iso のコンパイラ オプションを指定すると C++11 ISO 標準の volatile のキーワードが異なる、Visual Studio でサポートされていることに注意してください。(ARM、に対して既定で指定された)。C++11 ISO 標準のコード volatile のキーワードはハードウェアのアクセスにのみ使用してください; スレッド間通信には使用しないでください。スレッド間通信に、[C++ Standard Template Library]から std::atomic<T> などの機構を使用します。

Microsoft 固有の仕様 →

ARM 以外のアーキテクチャを対象とする場合 /volatile:ms のコンパイラ オプションが既定使用している場合、コンパイラは維持するために、追加のコードを保守の命令の他に、グローバル オブジェクトへの参照に volatile オブジェクトへの参照の間の命令が生成されます。特に次の点に注意してください。

  • 揮発性オブジェクト (または volatile 書き込み) への書き込みにリリースのセマンティクスを持っています; つまり、揮発性コンパイル binary に作成するため命令シーケンスの揮発性オブジェクトへの書き込みを行う前に発生する前に行われるグローバル変数または静的オブジェクトへの参照。

  • 揮発性オブジェクト (読み取り揮発性とも呼ばれます) の読み取りセマンティクスの取得を持っています; つまり、命令シーケンスの揮発性メモリの読み取り、揮発性読み取られた binary コンパイル後に発生後に発生するグローバル変数または静的オブジェクトへの参照。

これによって、マルチスレッド アプリケーションでのメモリのロックと解放に揮発性オブジェクトを使用できるようになります。

[!メモ]

これは /volatile:ms のコンパイラ オプションを使用すると、提供される拡張保護を使用すると、コードからは、移動可能です。

参照

関連項目

C++ のキーワード

定数 (C++)

定数ポインターと揮発性