2011-08-03 12 views

答えて

16

The article mentioned in this blog postハーブ・サッター(Herb Sutter)著、C、C++、Java、およびC#での揮発性の使い方と意味を簡潔かつ明確に説明しています。

EDIT:最初のリンク(Herb Sutterのブログへのリンク)に記載されているDDJの記事には、「exact link」と混同しないようにしてください。

また、Nigel Jonesのthis articleは、埋め込みCプログラミングの文脈でvolatileキーワードを説明しています。この質問がインタビューでポップアップしたように見えるので、同じ著者による私のお気に入り( "exact link")の一つであり、Cの世界で揮発性のもう一つの良い説明があります。揮発性Cで

+0

あなたのリンクをたどって私は違いを理解できませんでした –

+1

@ルイスFilipe何を正確に理解できませんでしたか? C/C++では "Unusual memory semantics"(HWレジスタ、複数のアドレスでのメモリの記述)に使用されています。 – celavek

+0

あなたはJava/.NET(C#実際のddjの記事に従わなければなりません。それがリンクするのが簡単かどうかはわかりません(広告)。 –

2

は、変数へのアクセスを最適化しないコンパイラに指示:「(走行)しながら」

int running = 1; 
void run() { 
    while (running) { 
     // Do something, but 'running' is not used at all within the loop. 
    } 
} 

通常コンパイラはわずか「(1)一方、」に、この場合に変換することができます。 'running'変数がvolatileとしてマークされると、コンパイラは毎回変数をチェックするように強制されます。

重要なのは、ハードウェア(CPUキャッシュ、命令パイプラインなど)がまだメモリアクセスを再配列している間に、C 'volatileはコンパイラの最適化を制限するだけです。 Cコンパイラが最適化しないようにハードウェアに指示する方法はありません。あなたはそれを自分で行う必要があります(たとえば、メモリバリアを使用して)。

として、私の知る(私は完全にはよく分からない)とC#の仕様が少しさらにこれをとります

  • あなたは揮発性変数に書き込む場合は、すべてのメモリを使うことにアクセスすることを保証されていますそれが完了する前に行う。
  • volatile変数から読み込むと、volatile変数の読み込みが完了する前に完了していないメモリアクセスがすべて確実に行われます。