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 の解釈、volatileターゲット アーキテクチャに応じて、異なるキーワード。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.

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

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

場合、structメンバーをマークvolatile、しvolatile構造全体に伝達されます。If a struct member is marked as volatile, then volatile is propagated to the whole structure. 構造体がコピーできる長さ、現在のアーキテクチャで 1 つの命令を使用してvolatileその構造に完全に失われる可能性があります。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.

volatileキーワード効果を持ちませんフィールドで、次の条件のいずれかが 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.

  • 含んでいる最も外側の長さstruct: おそらく入れ子になったのメンバーである場合またはstruct— 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.

キャッシュ不可能な変数としてマークする必要がありますが、プロセッサには、キャッシュ不可能なメモリ アクセス並べ替えされません、volatileコンパイラがメモリを並べ替えるしないことを保証するためにアクセスします。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.

として宣言されているオブジェクトvolatileその値は、いつでもでも変更できるため、特定の最適化では使用されません。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 キーワード、またはの動作に慣れて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). volatile; ハードウェアへのアクセスにのみ使用する 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. スレッド間通信には、 C++標準ライブラリstd:: atomic<t >などの機構を使用します。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 以外のアーキテクチャが対象となっている場合、既定では、コンパイラは、他のグローバルオブジェクトへの参照の順序を維持するだけでなく、揮発性オブジェクトへの参照の順序を維持するために追加のコードを生成します。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