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


96

私が持っている場合:

struct whatever {
int data;
};
volatile whatever test;
test.data、あまりにも揮発性?


4
すばらしい質問です。volatileメンバー関数を持つとthisポインターが揮発するだけなので、メンバーはアクセスされるたびにメモリから読み取られますが、「公式には」揮発性ではありません。
Alexandre C.

2
おそらく重複していますが、それでも良い質問です。
Sergei Tachenov 2010

回答:


119

別の質問をすることができます(または単に元の質問を見る別の方法):

構造体をconst作成すると、すべてのメンバーが作成されconstますか?

私が持っている場合:

struct whatever { int data; };

const whatever test;

test.data constもでしょうか?

私の答えは:はい。タイプのオブジェクトを宣言するwhateverconst、そのすべてのメンバーもconst同様になります

同様に、でオブジェクトを宣言するwhatevervolatile、そのすべてのメンバーvolatileも同様になり、でオブジェクトを宣言した場合と同様に、そのすべてのメンバーも同様constになりconstます。

constそして、volatile同じコインの両面です。それらは、標準がしばしばそれらをと呼ぶようにするためcv-qualifiersです。


標準からの引用(7.1.5.1/8ドル)

[注:揮発性は、オブジェクトの値が実装によって検出されない方法で変更される可能性がある ためオブジェクトを含む積極的な最適化を回避するための実装へのヒントです。詳細なセマンティクスについては、1.9を参照してください。一般に、volatileのセマンティクスは、C ++でもCと同じであることを意図しています。]

あなたのオブジェクトは、構造体のインスタンスである場合を意味し、その後、コンパイラはできませんオブジェクトを含む積極的な最適化を避けるためしない限り、それはそれのメンバーのそれぞれの積極的な最適化を避けることができます。(それ以外の場合、オブジェクトを含む最適化を他にどのように回避できますか?)


関連トピック:

C ++でvolatileキーワードを使用する理由


誠実さが直接のメンバーにのみ伝播されることに注意することが重要です。構造体がオブジェクトへのポインタを保持している場合、ポインタ自体はconstになります(たとえば、再割り当てできなくなります)が、ポイントされているオブジェクトを変更することはできます。(あなたの構造体がconstへのポインタを隠していないと仮定します)
Pablo Arias

-2

送信元:http : //msdn.microsoft.com/en-us/library/145yc477%28v=vs.80%29.aspx

ポインターが指すオブジェクトをconstまたはvolatileとして宣言するには、次の形式の宣言を使用します。

const char *cpch;
volatile char *vpch;

ポインターの値(つまり、ポインターに格納されている実際のアドレス)をconstまたはvolatileとして宣言するには、次の形式の宣言を使用します。

char * const pchc;
char * volatile pchv;

3
質問への回答ではありません
ヤコブファンベツレヘム
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.