ビットフィールドをユニオンで使用できますか?
4 に答える
はい、できます。なぜだめですか?共用体のビットフィールドは、他の場所と同じように動作します。ユニオン (またはビットフィールドを含むユニオン) のビットフィールドについて特別なことは何もありません。
組合がどのように機能するかを考えると、答えはあります。もちろん、そうです(なぜそうではないのですか)。予想どおり、ユニオンは最大のデータムを保持するのに十分な大きさであるため、自動的に小さくなります。ビットフィールドは「コンテナ」にパックされており、コンパイラは最終的な実際のサイズを評価できる必要があります。以下は、いくつかの興味深い事実を示しています(もちろん、ユニオンの誤った使用法ですが、ビットフィールドの存在についてはそうではありません!)
#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);
}
はい、可能ですが、お勧めしません。ビットフィールドの長さとパッキングは移植性がありません。ユニオンのサイズを予測するのは困難です (こちらを参照)。ユニオンまたはビットフィールドを使用すると、コードにある程度の複雑さが生じます。この複雑さはコードで許容できる場合もありますが、この 2 つを組み合わせると、許容できない量の複雑さが生じる可能性があります。共用体、構造体、およびビットフィールドを使用している場合は、メモリ アラインメントで問題が発生します。
これが 1 台のマシンでのみビルドして実行する必要がある使い捨てコードである場合は、おそらく問題ありません。ただし、これを永久に存続するバージョン管理にチェックインする場合は、お勧めしません。
これを行う理由の例を挙げれば、私または他の誰かがより良い代替案を提案できます。
編集:コメントに基づいて明確にし、フィードバックを求めます。
あるユニオン要素に書き込み、別のユニオン要素から読み取る場合にのみ安全ではありません。実装の詳細により、それが起こらないことが保証されている場合、ビット化された (およびおそらく他のメンバー) を含むユニオンは、明確に定義された安全な動作をしています。