458

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.

4

2 に答える 2

1350

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

int some_int = 100;

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

このプログラムがコンパイルされると、プログラムが の値を変更しようとしないこと判明した場合、コンパイラはこのコードを最適some_int化することがありますwhile。実行が高速になる可能性があること(ループ内の条件が常にあるように見えるため)。(コンパイラが最適化しない場合、値を取得して 100 と比較する必要がありますが、これは明らかに少し遅いです。)while(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 は、オブジェクトの値が実装によって検出できない方法で変更される可能性があるため、オブジェクトを含む積極的な最適化を回避するための実装へのヒントです。[...]

関連トピック:

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

于 2010-12-14T09:18:14.667 に答える
26

コンピュータ プログラミング、特に C、C++、および C# プログラミング言語では、volatileキーワードで宣言された変数またはオブジェクトには、通常、最適化やスレッド化に関連する特別なプロパティがあります。一般的に言えば、このvolatileキーワードは、(疑似) コンパイラーが、変数の値が「独自に」変更できないと想定するコードに最適化を適用するのを防ぐことを目的としています。(c) ウィキペディア

http://en.wikipedia.org/wiki/Volatile_variable

于 2010-12-14T09:17:19.730 に答える