2009-06-11 31 views

答えて

25

structフィールドとまったく同じ:

#include <stdio.h> 
int main (int c, char *v[]) { 
    struct _a { 
     int a1; 
     volatile int a2; 
     int a3; 
    } a; 
    a.a1 = 1; 
    a.a2 = 2; 
    a.a3 = 3; 
    return 0; 
} 

あなたは"volatile struct _a {...}"を使用するなど、揮発性の全体structをマークすることができますが、上記の方法は、個々のフィールドのためです。

9

this記事によると、かなりまっすぐ進むことが必要です。

最後に、あなたが 構造体または共用体に揮発適用した場合、コンテンツ全体構造体/共用体の は揮発性です。 この動作が必要ない場合は、 構造体/共用体の個々のメンバー にvolatile修飾子を適用できます。

1

C/C++のvolatileキーワードに関する警告です。

何をしているのか分からない限り、決して使用しないでください。あなたは本当にあなたが何をしているか知っている限り

揮発性

C/C++揮発!=のJava/C#の揮発性は、スレッド化コードでは役に立たない、あなたはC++ 0xのアトミックテンプレート(または類似したもの)を使用する必要があります。

ハードウェアレジスタを制御するときだけ揮発性を使用しなければなりませんでした。

+0

私は厳密に必要とされるよりも少し強いと述べました。 volatileはスレッドコード、特にシングルコアの組み込みプラットフォームで役立ちます。しかし、あなたはそれを使う方法を知っていなければなりません。また、DMAの有無にかかわらずハードウェアレジスタを参照する場合、特にステータスのためにポーリングされるレジスタを参照する場合には、事実上必須です。また、キャッシュとそれを正しく管理する方法を理解し、プラットフォーム上でアトミック操作を実行する方法を理解することも必要です。 – RBerteig

+0

あなたは正しいです。私はDMAと言ったときに私が思っていたことを知らなかった、私はMMIOを意味した。私は何か良い答えを編集しました(私は願っています)。 –

+0

ウィキペディア(http://en.wikipedia.org/wiki/Volatile_variable)によると、C#はC/C++と同じ動作をしているように見えますが、Javaだけが異なるセマンティックを持っています。 –

0

もしvolatileの宣言されたメンバが何らかの割り込み(シグナルハンドラや他の原子に近い)のために変更されていない場合は、おそらくvolatileを使用してはいけません(ほとんどのコンパイラは、十分に近く)。それ以外の場合は

、他の人が言ってきたように...ちょうどそれらをチェックし、その価値は...のgccすなわち特定のバージョン、ASMは、コンパイラが実際にあなたに同意する場合:)

いくつかのケースで見てダンプを調べて、それを使用しますダンプ。

関連する問題