volatile (C++)volatile (C++)

オブジェクトをハードウェアがプログラム内で変更できることを宣言するために使用できる型修飾子です。A type qualifier that you can use to declare that an object can be modified in the program by the hardware.

構文Syntax

volatile declarator ;

RemarksRemarks

使用することができます、 /volatileコンパイラ スイッチをコンパイラがこのキーワードはどのように解釈する方法を変更します。You can use the /volatile compiler switch to modify how the compiler interprets this keyword.

Visual Studio の解釈、揮発性ターゲット アーキテクチャに応じて、異なるキーワード。Visual Studio interprets the volatile keyword differently depending on the target architecture. いない場合、ARM の /volatileコンパイラ オプションを指定すると、コンパイラは、実行場合と /volatile:iso指定されました。For ARM, if no /volatile compiler option is specified, the compiler performs as if /volatile:iso were specified. ない場合は、ARM 以外のアーキテクチャの /volatileコンパイラ オプションを指定すると、コンパイラは、実行場合と /volatile:ms ; 指定されたアーキテクチャのため、以外の厳密に ARM指定することが勧め /volatile:isoスレッド間で共有されているメモリを扱うときに、明示的な同期プリミティブとコンパイラ組み込み関数を使用します。For architectures other than ARM, if no /volatile compiler option is specified, the compiler performs as if /volatile:ms were specified; therefore, for architectures other than ARM we strongly recommend that you specify /volatile:iso, and use explicit synchronization primitives and compiler intrinsics when you are dealing with memory that is shared across threads.

使用することができます、揮発性割り込みハンドラーのような非同期プロセスによって使用されるメモリの場所へのアクセスを提供する修飾子。You can use the volatile qualifier to provide access to memory locations that are used by asynchronous processes such as interrupt handlers.

ときに揮発性も持っている変数の使用は、 _ _restrictキーワード、揮発性が優先されます。When volatile is used on a variable that also has the __restrict keyword, volatile takes precedence.

場合、構造体メンバーをマーク揮発性、し揮発性構造全体に伝達されます。If a struct member is marked as volatile, then volatile is propagated to the whole structure. 構造体がコピーできる長さ、現在のアーキテクチャで 1 つの命令を使用して揮発性その構造に完全に失われる可能性があります。If a structure does not have a length that can be copied on the current architecture by using one instruction, volatile may be completely lost on that structure.

揮発性キーワード効果を持ちませんフィールドで、次の条件のいずれかが true の場合。The volatile keyword may have no effect on a field if one of the following conditions is true:

  • volatile フィールドの長さが、現在のアーキテクチャで 1 つの命令を使用してコピーできる最大サイズを超えている。The length of the volatile field exceeds the maximum size that can be copied on the current architecture by using one instruction.

  • 含んでいる最も外側の長さ構造体: おそらく入れ子になったのメンバーである場合または構造体— 1 つの命令を使用して、現在のアーキテクチャでコピーできる最大サイズを超えています。The length of the outermost containing struct—or if it's a member of a possibly nested struct—exceeds the maximum size that can be copied on the current architecture by using one instruction.

キャッシュ不可能な変数としてマークする必要がありますが、プロセッサには、キャッシュ不可能なメモリ アクセス並べ替えされません、揮発性コンパイラがメモリを並べ替えるしないことを保証するためにアクセスします。Although the processor does not reorder un-cacheable memory accesses, un-cacheable variables must be marked as volatile to guarantee that the compiler does not reorder the memory accesses.

として宣言されているオブジェクト揮発性その値は、いつでもでも変更できるため、特定の最適化では使用されません。Objects that are declared as volatile are not used in certain optimizations because their values can change at any time. システムは、以前の命令で同じオブジェクトの値が要求されていても、常に volatile オブジェクトの現在の値を、要求されたときに読み取ります。The system always reads the current value of a volatile object when it is requested, even if a previous instruction asked for a value from the same object. また、オブジェクトの値は、代入時にすぐに書き込まれます。Also, the value of the object is written immediately on assignment.

ISO 準拠 →ISO Compliant

慣れている場合、 C# volatile キーワード、またはの動作に慣れて揮発性以前のバージョンの MicrosoftC++コンパイラ (MSVC) がありますが、c++ 11 ISO 標準volatileキーワードは異なっており、MSVC のサポートは、ときに、 /volatile:isoコンパイラ オプションを指定します。If you are familiar with the C# volatile keyword, or familiar with the behavior of volatile in earlier versions of the Microsoft C++ compiler (MSVC), be aware that the C++11 ISO Standard volatile keyword is different and is supported in MSVC when the /volatile:iso compiler option is specified. ARM では、このオプションが既定で指定されています。(For ARM, it's specified by default). 揮発性; ハードウェアへのアクセスにのみ使用する c++ 11 ISO 標準コードのキーワードは、スレッド間通信に使用しないでください。The volatile keyword in C++11 ISO Standard code is to be used only for hardware access; do not use it for inter-thread communication. スレッド間の通信の場合などのメカニズムを使用してstd::atomic<T >から、 C++ 標準ライブラリします。For inter-thread communication, use mechanisms such as std::atomic<T> from the C++ Standard Library.

END ISO 準拠End of ISO Compliant

Microsoft 固有の仕様Microsoft Specific

ときに、 /volatile:msコンパイラ オプションを使用: ARM 以外のアーキテクチャが対象となる場合、既定で、コンパイラは volatile オブジェクトへの参照間の順序を維持するために余分なコードを生成しますその他のグローバル オブジェクトへの参照を順序付けします。When the /volatile:ms compiler option is used—by default when architectures other than ARM are targeted—the compiler generates extra code to maintain ordering among references to volatile objects in addition to maintaining ordering to references to other global objects. 特に次の点に注意してください。In particular:

  • volatile オブジェクトへの書き込み (volatile 書き込み) は、解放セマンティクスを持っています。つまり、命令シーケンスで volatile オブジェクトへの書き込み前に発生するグローバル オブジェクトまたは静的オブジェクトへの参照は、コンパイルされたバイナリでの volatile 書き込みの前に発生します。A write to a volatile object (also known as volatile write) has Release semantics; that is, a reference to a global or static object that occurs before a write to a volatile object in the instruction sequence will occur before that volatile write in the compiled binary.

  • volatile オブジェクトの読み取り (volatile 読み取り) は、取得セマンティクスを持っています。つまり、命令シーケンスで volatile メモリの読み取り後に発生するグローバル オブジェクトまたは静的オブジェクトへの参照は、コンパイルされたバイナリでの volatile 読み取りの後に発生します。A read of a volatile object (also known as volatile read) has Acquire semantics; that is, a reference to a global or static object that occurs after a read of volatile memory in the instruction sequence will occur after that volatile read in the compiled binary.

これによって、マルチスレッド アプリケーションでのメモリのロックと解放に volatile オブジェクトを使用できるようになります。This enables volatile objects to be used for memory locks and releases in multithreaded applications.

注意

によって提供される強化された保証に依存、 /volatile:msコンパイラ オプションを使用すると、コードはポータブルでないです。When it relies on the enhanced guarantee that's provided when the /volatile:ms compiler option is used, the code is non-portable.

Microsoft 固有の仕様はここまでEND Microsoft Specific

関連項目See also

キーワードKeywords
constconst
const ポインターと volatile ポインターconst and volatile Pointers