Possible Duplicate:
Why does volatile exist?
I have never used it but I wonder why people use it? What does it exactly do? I searched the forum, I found it only C# or Java topics.
Possible Duplicate:
Why does volatile exist?
I have never used it but I wonder why people use it? What does it exactly do? I searched the forum, I found it only C# or Java topics.
このコードを考えてみましょう。
int some_int = 100;
while(some_int == 100)
{
//your code
}
このプログラムがコンパイルされると、プログラムが の値を変更しようとしないことが判明した場合、コンパイラはこのコードを最適some_int
化することがありますwhile
。実行が高速になる可能性があること(ループ内の条件が常にあるように見えるため)。(コンパイラが最適化しない場合、値を取得して 100 と比較する必要がありますが、これは明らかに少し遅いです。)while(some_int == 100)
while(true)
while
true
some_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 は、オブジェクトの値が実装によって検出できない方法で変更される可能性があるため、オブジェクトを含む積極的な最適化を回避するための実装へのヒントです。[...]
関連トピック:
コンピュータ プログラミング、特に C、C++、および C# プログラミング言語では、volatile
キーワードで宣言された変数またはオブジェクトには、通常、最適化やスレッド化に関連する特別なプロパティがあります。一般的に言えば、このvolatile
キーワードは、(疑似) コンパイラーが、変数の値が「独自に」変更できないと想定するコードに最適化を適用するのを防ぐことを目的としています。(c) ウィキペディア