最適化処理では、コード上無駄な処理と思われる部分を省略するようにコンパイルします。例えば、以下のようにループ処理の条件としてフラグを定義し、初期値のみ与え、ループ内ではその値を変更しないとします。
bflag = true;
while(bflag) {
. . .
}
bflagの値が変更されないため、最適化処理では例えば以下のようなコードに省略します。
while(1) {
. . .
}
もしこのコードがシングルスレッド上で実行され、変数の値が外部要素によって影響されないのであれば、最適化処理を行なっていないコードと同じ実行結果となり問題は発生しませんが、マルチスレッドやハードウェアなど外部要素によりフラグの値が変更されるケースでは想定外の動きになる可能性があります。
こういう外部要素によって想定外の動きが発生する可能性のある変数(この例ではbflag)に対して、宣言時に volatile 修飾子を付与すればその変数に関する最適化処理を抑止することができます。
【確認済みのバージョン】C.11.31.06
【確認済みの対象OS】HP-UX IPF 11iv3
【カテゴリー】開発/設計(性能チューニング)