12

私が書いているいくつかの低レベルのコードに問題があります。オブジェクトを揮発性として使用する必要がありますが、(再利用性の理由から) 型を揮発性として宣言する必要があるとは限りません。ただし、次のセグメントで詳しく説明するように、構造体の修飾バリアントへのポインターを定義できます。

struct x {
  int bar;
};

struct x foobar;
...
volatile struct x *foo = &foobar;

これで foo は事実上、次の型のオブジェクトへのポインターになります。

volatile struct x {
  volatile int x;
};

volatile はすべての構造体メンバーに適用されるためです。ここで私の質問は、オブジェクトに別のオブジェクトへのポインターが含まれている場合、揮発性はどのように適用されるのですか?

struct x {
  struct y *bar;
};

x の揮発性インスタンスへのポインターは、次のように扱います。

volatile struct x {
  struct y * volatile bar;
};

またはとして:

volatile struct x {
  volatile struct y * volatile bar;
};

私はC標準を読みましたが、これに関してはあまり明確ではなく、複数の方法で言葉遣いを簡単に解釈できます.

4

2 に答える 2

4

あなたの例では、揮発性ポインターを取得します。つまり、揮発性はオブジェクトに拡張されません。

私の答えを拡張すると、 volatile はリラックスしたアトミックです。つまり、アクセスはアトミックですが、命令はアトミックではありません。したがって、揮発性をスレッドセーフにインクリメントまたはデクリメントすることはできません。そのため、揮発性ポインターを反復に使用することはできず、ストア/ロード (割り当て) 操作のみを使用できます。同じことが int または別の数値にも当てはまります。浮動小数点数は CPU ではなく FPU パイプラインで処理されるため、volatile も浮動小数点数では機能しません。全体として、揮発性はあまり有用ではありませんが、Microsoft のコンパイラは、揮発性を真の原子値にする命令ガードを自動的に配置しますが、それは標準の一部ではありません。

于 2009-06-11T14:26:06.277 に答える
2

ここで標準を読むと、ポインターは揮発性であるように見えますが、構造体自体の実際の内容ではありません。与えられた例からそれを解釈しましたconst t * volatile p(リンクの下部にあります)。ただし、文言はあいまいですが、これは同様の例になると思います。

struct foo {
    int bar;
};

struct foo *volatile x;

私はこれを試していないことに注意してください。したがって、私は非常に間違っている可能性があります...これは、標準をざっと読んで集めたものにすぎません。

さらに、 cdecl はあいまいさの一部を解消します。例えば:

cdecl> Explain volatile struct x* foo
foo を volatile struct x へのポインターとして宣言する

一方:

cdecl> Explain struct x* volatile foo
foo を構造体 x への揮発性ポインターとして宣言する

ある例では、構造体は揮発性です。もう一つはポインタ。

于 2009-06-11T14:28:09.423 に答える