15

const volatile次のような修飾変数 の実用的な使用法を見ることができます

const volatile uint64_t seconds_since_1970;

基盤となるハードウェアメカニズムが毎秒値を更新するが、変数が(おそらく埋め込まれた)ハードウェアで書き込み可能でない場合。また、3つすべて(C11では4つ)の型修飾子は独立していると見なされるため、すべての組み合わせが許可されているようです。しかし、私は、restrict volatile修飾されたポインターが本当に意味をなす実際の状況を想像するのに途方に暮れています。

uint32_t * restrict volatile pointer_to_some_uint32;

[編集:明確にするために:両方とも、ポイントされたオブジェクトではなく、ポインターvolatilerestrict適用されます!]

これは言語で許可されているがそれ自体では役に立たない構造ですか、それともこれが役立つ可能性のあるアプリケーション領域が不足していますか?

4

1 に答える 1

11

制限なしで、不揮発性ポインターは揮発性ポインターをエイリアスできます。したがって、揮発性ポインタを介してオブジェクトを変更するたびに、同じタイプのすべての潜在的にポインタ参照されるオブジェクトのレジスタキャッシュ値を破棄する必要があります。

制限を使用すると、揮発性ポインターがエイリアスしないようにコンパイラーに指示できます。そのため、volatileのオーバーヘッドは、ポインターを介してアクセスできる同じタイプの他のすべてのオブジェクトではなく、ポイントされたオブジェクトにのみ適用されます。

于 2012-01-24T15:24:48.523 に答える