2010-12-14 23 views
237

可能性の重複:
C++: When Has The volatile Keyword Ever Helped You?C++でvolatileキーワードを使用するのはなぜですか?

私はそれを使ったことがないが、人々はそれを使用する私はなぜだろうか?それは何を正確にしていますか?フォーラムを検索したところ、C#またはJavaのトピックしか見つかりませんでした。

+0

同じ:揮発性を持っている場合キーワードはあなたを助けたことがありますか? ](http://stackoverflow.com/questions/72552/c-when-has-the-volatile-keyword-ever-helped-you)。 –

+10

これは重複していますが、Nawazの答えは重複した質問よりはるかに包括的かつ理解しやすいと思います。 – ross

答えて

798

このプログラムがコンパイルされるとき、それはプログラムが決して史上some_intの値を変更しようとする試みを作ることを発見した場合、コンパイラはそのように、このコードを最適化することができる

int some_int = 100; 

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

、このコードを考えてみましょう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によって変更することができます あなたも気づいていないことがあります。 XYZは何でもかまいません。多分いくつかこの惑星外の外国人は プログラムと呼ばれています。多分いくつかの照明、いくつかの 割り込み、火山などの形をすることができます 私を変えてください。多分。あなたは が私を変えようとしているのか分からない!だからあなたは 無知で、すべて知っていることをやめてください。 神様、私はどこにいるのですか。コード に触れてください。大丈夫?」

まあ、それはvolatileは、コードの最適化から、コンパイラを防ぐ方法です。今、いくつかのサンプル例を参照するためにそれをグーグル。


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

[..]揮発性は、オブジェクトを含む 実装に回避積極的な 最適化へのヒントですオブジェクトの値が 実装では検出できない手段によって変更される場合がありますので、[...]

関連トピック:[C++など

Does making a struct volatile make all its members volatile?

+46

'volatile'は' const'に似た修飾子ですが(もちろん意味が違う)、 'volatile'インスタンスに対してのみ呼び出すことのできる' volatile'メソッドを宣言することもできます。 – ereOn

+0

@ fingerprint211b:感謝します:-)(人々が良い仕事を奨励していないことは残念です;逆に彼らはそれを落胆させます;彼らは私に彼らがそれをする理由を教えてもそれは問題ではありません。 – Nawaz

+0

これは 'extern'キーワードのためのものだと思いましたか? – Maxpm

8

コンピュータプログラミング、特にC、C++、C#プログラミング言語では、volatileキーワードで宣言された変数またはオブジェクトには、通常、最適化やスレッド化に関する特殊なプロパティがあります。一般的に言えば、volatileキーワードは、(擬似)コンパイラが変数の値を "単独で"変更できないと仮定してコードに最適化を適用しないようにするためのものです。 (C)ウィキペディア

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

+27

volatileはスレッドとは何の関係もありません –

+20

volatileキーワードは、オペレーティングシステム、ハードウェア、または同時に実行されているスレッドなどによってプログラム内でオブジェクトを修正できることを宣言するために使用される型修飾子です。 (c)MSDN C++リファレンス。 (http://msdn.microsoft.com/en-us/library/12a04hfd(v=vs.80).aspx) 間違いなく、msdnとwikipediaが間違っていて、正しいです。 – Ivan

+3

'volatile'はスレッディングには役立ちません。揮発性の読み込み/書き込みは、不揮発性のものに対しても並び替えることができ、スレッド化の目的には役に立たない。また、MSDNのページで「Microsoft Specific」という大きな話題を気付いたこともあります。マイクロソフトの揮発性の実装は、標準で規定されているものを超える追加の保証を提供します。だから、技術的に言えば、MSDNは間違っています。そして、ウィキペディアが間違っていることは驚きではありません。 – jalf

-5

は、揮発性のキーワードは、オブジェクトが、オペレーティングシステム、ハードウェア、または同時に実行中のスレッドのようなものによってプログラムで変更することができることを宣言するために使用されるタイプの修飾子です。

揮発性宣言子。

+13

回答のコピー貼り付けは、通常、元のソースの関連部分をリンクしながら引用して行います。そうしないと、私が嫌う剽窃の悲惨なケースです。あなたが元の記事を書いたとしても、それにリンクされていないのは自己剽窃(間違いなく嫌なことです)です。 –

関連する問題