1. ホーム
  2. c++

[解決済み】なぜvolatileキーワードを使用するのですか?重複

2022-04-15 17:52:57

質問

<ブロッククオート

重複の可能性があります。

なぜvolatileが存在するのですか?

私は使ったことがないのですが、なぜみんな使うのでしょうね?具体的に何をするものなのでしょうか?フォーラムを検索しても、C#かJavaのトピックしか出てきません。

どのように解決するのですか?

次のコードを考えてみてください。

int some_int = 100;

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

このプログラムがコンパイルされるとき、コンパイラはこのコードを最適化することがあります。 決して の値を変更しようとしたことは一度もありません。 some_int を最適化したくなるかもしれません。 while ループを while(some_int == 100) から 何か と等価である。 while(true) を使えば、実行が速くなります。 while ループは、どうやら true 常に)です。 (コンパイラが最適化しない場合、値をフェッチする必要があるため some_int を100と比較する必要があり、各反復で明らかに少し遅くなります)。

しかし、時には、(プログラムの一部の)最適化が 好ましくない の値を他の人が変えている可能性があるからです。 some_int から コンパイラが認識していないプログラム外部での しかし、それはあなたが設計した方法なのです。この場合、コンパイラの最適化は、以下のようになります。 ではなく は望ましい結果をもたらします!

そこで、望ましい結果を得るためには、コンパイラが while ループになります。そこで volatile キーワードがその役割を果たします。必要なのは、これだけです。

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


つまり、次のように説明するのです。

volatile は、コンパイラにこう伝えます。

コンパイラの皆さん、私は揮発性です。 によって変更される可能性があります。 を意識することはない。その XYZは何でもありです。もしかしたら というこの惑星の外にいる宇宙人 プログラムです。もしかしたら、雷、何らかの を、火山などによる割り込みの形態で行うことができます。 私を変異させる。そうかもしれません 誰がどうなるかわからない が私を変えてくれる! だから、あなた 無知な人は、全知全能を装うのはやめましょう。 神、そしてあえてコードに触れないでください。 私がいるところ OK?"。

さて、そんなこんなで volatile は、コンパイラがコードを最適化するのを防ぎます。では、Webでサンプルを検索して見てください。


C++規格($7.1.5.1/8)から引用します。

[volatile は、以下のようなヒントです。 に実装する。 積極的な オブジェクトを含む最適化 なぜなら、オブジェクトの値が が検出できない手段で変更される。 の実装が必要です。

関連するトピック

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