任意の変数は、const
またはvolatile
(またはその両方)と宣言できますが、セマンティクスは異なります。
キーワードconst
は、変数が定数であることを示します。 volatile
キーワードは、何も割り当てていなくても変数の内容が変更されている可能性があることを示します。あなたは
int a = ...;
int b = ...;
int sum1 = (a + b) * 2;
int sum2 = (a + b) + 16;
コードのこの部分を持っているし、あなたのコンパイラの最適化を有効にした場合
例えば、コンパイラは、このに、以前のコードを最適化することができます
int a = ...;
int b = ...;
int temp = a + b;
int sum1 = temp * 2;
int sum2 = temp + 16;
この最適化が原因で発生しますコンパイラはsum1とsum2の計算時にaとbの値が変化しないと仮定しているため、a + bは変化しません。aまたはbをvolatile
と宣言すると、この仮定は否定されます。つまり、コンパイラは+ bを毎回計算し、一時的な場所に格納しないコードを生成します。これは、aまたはbを宣言することにより、aまたはb(したがって、a + b)が2つのステートメントの実行の間に変更された可能性があることを示すためです。
volatile
はマルチスレッドアプリケーションやメモリマップされたI/O(ハードウェアとの通信にシステムメモリを使用している)を使用する場合には役に立たないキーワードのようです。例えば、ゲームボーイアドバンスでは、一度にどのキーが押されたかを判断するために、特定のメモリ位置を読み取らなければならない。その特定のメモリ位置へのポインタをvolatileと宣言すると、毎回その特定のデータをメモリから読み取ることが常に保証されます。
私は答えがイエスだと信じています。答えとして投稿してください。上記のそれぞれの証拠をスタンダードから提供する必要があり、それらはさまざまなセクションに分散しています。 –