8

最近、次のスニペットに出くわしました。これは、のすべてのバイトi(nad no more) が の個々の要素としてアクセスできるようにする試みcです。

union {
  int i;
  char c[sizeof(int)];
};

これは良いアイデアのように思えますが、 のアラインメント要件charint.

言い換えれば、char16 で整列する必要がある 1 バイト (定義上は 1 バイトです。以下を参照) と4 バイト境界で整列する必要がある 4 バイトの int を持つことは可能ですか? -バイト境界?

そして、これは上記のユニオンの使用を詰まらせるでしょうか?

注意すべきことが2つあります。

  1. ここで私が話しているのは、ここで標準が許可しているものについて具体的に話しているのであって、健全な実装者/アーキテクチャが提供するものではありません。

  2. ISO C の意味で「バイト」という用語を使用しています。これは a の幅でありchar、必ずしも 8 ビットではありません。

4

2 に答える 2

7

サイズよりも厳密なアラインメント要件を持つ型はありません (配列のしくみのため) sizeof(char)。1 です。

明らかでない場合:

  • sizeof(T [N])ですsizeof(T)*N
  • sizeofの単位ですchar。すべてのタイプは固定バイト数 ( char) で表され、その数がサイズになります。詳細については、6.2.6 (型の表現) を参照してください。
  • を考えるとT A[2];(char *)&A[1] - (char *)&A[0]に等しいsizeof A[0]です。
  • したがって、 のアラインメント要件Tは を超えませんsizeof(T)(実際には を割りsizeof(T)ます) 。
于 2010-12-21T05:26:43.313 に答える
2

このスレッドを見てください。そこで、私は C ユニオンの有用性に疑問を呈し、興味深い洞察がいくつかありました。重要なことは、標準がさまざまなフィールドの整合性をまったく保証していないということです!

編集: paxdiablo さん、あなたがその質問に答えている人の 1 人であることに気付いたので、おそらくこの制限に精通しているはずです。

于 2010-12-21T06:07:10.443 に答える