4

any_t任意の型 ( intstruct something、…) です。

次の構造を検討してください。

struct my_struct {
    any_t val,
    any_t array[10]
}

変数を定義するとv:

struct my_struct v;

11項目&v.valの配列として使用しても安全ですか?any_t

any_t *p = &v.val;
f(p[0]);
f(p[5]);
f(p[10]);

valと の間にパディングが追加されないことが保証されていますarrayか?

4

3 に答える 3

7

C 標準だけからすると、次の理由から&v.val、11 の配列として使用するのは安全ではありません。any_t

  • C 標準では、構造体で名前のない内部パディングが許可されています。valC の実装で と の間にパディングを挿入するのは珍しいことです。これは、アラインメント要件では必要ないためです。ただし、パディングは許可されており、 (必要ではなく) パフォーマンスのためにアラインメントを改善するarrayなど、特定の状況では有益であると考えられます。array
  • valと の要素の間隔がarray11 の配列と同じであるという保証があったとしてany_tも、ポインター演算が機能するという保証はありません。C 2011 (N1570) 6.5.6 8 では、ポインター演算 (配列のインデックス付けを含む) が定義されており、配列内での算術演算のみが必要です(末尾に 1 つの概念要素を含む)。一部の C 実装では、ベース アンド オフセット アドレッシングが使用されます。このような場合、 のベース アドレスは、valに拡張されるオフセットをサポートしない可能性がありarrayます。
  • C 実装が単純なフラット アドレッシングを使用している場合でも、オプティマイザーは C 標準に基づいて推論を行うことができます。オプティマイザーは、理論上、ポインターが のアドレスから派生したものであることを認識valできるため、(C 標準に従って) 内の何かをアドレス指定するために使用することはできませんarray。たとえば、 を実行した場合、オプティマイザはおよびany_t *p = &v.val; p[i] = 3; v.array[j] = 4;への代入を独立したものとして扱い、同じ要素を指すようにおよびを設定したとしても、それらを任意の順序で実行する可能性があります。v.array[j]p[i]ij
于 2013-07-22T13:33:06.730 に答える
1

いいえ、標準では何も保証されていません。ただし、特定のコンパイラの実装は、標準によって行われるものを超えて確実に保証される場合があります。詳細については、ドキュメントを確認してください。

于 2013-07-22T13:12:45.427 に答える