なぜ volatile キーワードを使用するのですか? [重複] 質問する

なぜ volatile キーワードを使用するのですか? [重複] 質問する

重複の可能性あり:
揮発性物質はなぜ存在するのでしょうか?

使ったことはありませんが、なぜみんなが使っているのか不思議です。具体的に何をするのでしょうか? フォーラムを検索しましたが、C# または Java のトピックしか見つかりませんでした。

ベストアンサー1

このコードを考えてみましょう。

int some_int = 100;

while(some_int == 100)
{
   //your code
}

このプログラムがコンパイルされるとき、コンパイラは、プログラムがの値を変更しようとしないことがわかった場合、このコードを最適化する可能性があります。そのため、 を と同等のものに変更してループを最適化し、実行を高速化しようsome_intとする可能性があります(ループ内の条件がalwaysであるため)。(コンパイラが最適化しない場合は、各反復で の値をフェッチして 100 と比較する必要があり、明らかに少し遅くなります。)whilewhile(some_int == 100)while(true)whiletruesome_int

ただし、場合によっては、(プログラムの一部の) 最適化が望ましくないことがあります。これは、プログラムの外部some_intから誰かが の値を変更している可能性があり、コンパイラはそれを見ることができないため、そのことを認識していないためです。ただし、それは設計どおりです。その場合、コンパイラの最適化では、望ましい結果は得られません。

したがって、望ましい結果を確実に得るには、何らかの方法でコンパイラによるwhileループの最適化を停止する必要があります。ここでvolatileキーワードが役立ちます。必要なのは、次のことだけです。

volatile int some_int = 100; //note the 'volatile' qualifier now!

言い換えれば、私はこれを次のように説明します。

volatileコンパイラに次のように伝えます。

「おい、コンパイラ、私は不安定で、君が気付いていない XYZ によって変わることもある。その XYZ は何でもあり得る。もしかしたら、この惑星の外にいるプログラムと呼ばれるエイリアンかもしれない。雷、何らかの割り込み、火山などが私を変異させるかもしれない。そうかもしれない。誰が私を変えるかは分からない!だから、この無知な人よ、全知の神を演じるのはやめて、私がいるコードには絶対に触らないでくれ。いいか?」

さて、これがvolatileコンパイラがコードを最適化するのを防ぐ方法です。では、Web で検索してサンプル例をいくつか見てみましょう。


C++ 標準からの引用 ($7.1.5.1/8)

[..] volatile は、オブジェクトの値が実装によって検出できない方法で変更される可能性があるため、オブジェクトに関係する積極的な最適化を回避するための実装へのヒントです。[...]

関連トピック:

構造体を volatile にすると、そのすべてのメンバーが volatile になりますか?

おすすめ記事