9

ビットフィールドをユニオンで使用できますか?

4

4 に答える 4

8

はい、できます。なぜだめですか?共用体のビットフィールドは、他の場所と同じように動作します。ユニオン (またはビットフィールドを含むユニオン) のビットフィールドについて特別なことは何もありません。

于 2010-06-21T17:55:59.037 に答える
2

組合がどのように機能するかを考えると、答えはあります。もちろん、そうです(なぜそうではないのですか)。予想どおり、ユニオンは最大のデータムを保持するのに十分な大きさであるため、自動的に小さくなります。ビットフィールドは「コンテナ」にパックされており、コンパイラは最終的な実際のサイズを評価できる必要があります。以下は、いくつかの興味深い事実を示しています(もちろん、ユニオンの誤った使用法ですが、ビットフィールドの存在についてはそうではありません!)

#include <stdio.h>

union test {
  int a:5;
  int b:12;
  float c;
  double d;
  int x;
};

int main()
{
  union test x;
  printf("%d\n", sizeof(x));
  x.a = 31;
  printf("%d\n", x.a);
  printf("%d\n", x.b);
  x.c = 1.23;
  printf("%d\n", x.a);
  printf("%f\n", x.c);
  x.x = 31;
  printf("%d\n", x.x);
  printf("%d\n", x.a);
  printf("%d\n", x.b);
}
于 2010-06-21T18:34:28.590 に答える
2

はい、可能ですが、お勧めしません。ビットフィールドの長さとパッキングは移植性がありません。ユニオンのサイズを予測するのは困難です (こちらを参照)。ユニオンまたはビットフィールドを使用すると、コードにある程度の複雑さが生じます。この複雑さはコードで許容できる場合もありますが、この 2 つを組み合わせると、許容できない量の複雑さが生じる可能性があります。共用体、構造体、およびビットフィールドを使用している場合は、メモリ アラインメントで問題が発生します。

これが 1 台のマシンでのみビルドして実行する必要がある使い捨てコードである場合は、おそらく問題ありません。ただし、これを永久に存続するバージョン管理にチェックインする場合は、お勧めしません。

これを行う理由の例を挙げれば、私または他の誰かがより良い代替案を提案できます。

編集:コメントに基づいて明確にし、フィードバックを求めます。

于 2010-06-21T17:55:07.200 に答える
0

あるユニオン要素に書き込み、別のユニオン要素から読み取る場合にのみ安全ではありません。実装の詳細により、それが起こらないことが保証されている場合、ビット化された (およびおそらく他のメンバー) を含むユニオンは、明確に定義された安全な動作をしています。

于 2010-06-21T18:10:51.207 に答える