volatile 修飾 子は、データ・オブジェクトに対するメモリー・アクセスの整合性を維持します。揮発性オブジェクトは、 それらの値が必要になるたびにメモリーから読み取られ、変更されるたびにメモリーへ書き戻されます。volatile 修飾子は、コンパイラーの制御または検出以外の方法 (システム・クロックによって更新された変数など) で、値を変更できるデータ・オブジェクトを宣言します。その結果、コンパイラーは、オブジェクトを参照するコードに対して 特定の最適化を適用しないよう通知されます。
volatile で修飾された任意の左辺値の式にアクセスすると、副次作用が生じます。 副次作用とは、実行環境の状態が変化するということです。
オブジェクト型 "pointer to volatile" への参照は最適化されますが、それが指す 先のオブジェクトへの参照を最適化することはできません。 "pointer to volatile T" 型の値を "pointer to T" 型のオブジェクトに割り当てるためには、明示的なキャストを使用しなければなりません。 volatile オブジェクトの有効な使用法は、以下のとおりです。
volatile int * pvol; int *ptr; pvol = ptr; /* Legal */ ptr = (int *)pvol; /* Explicit cast required */
シグナル処理関数は、変数が volatile として宣言されていれば、型 sig_atomic_t の変数に値を保管できます。
これは、シグナル処理関数が静的ストレージ期間を使用した変数にアクセスできないという規則の
例外です。
関連参照