プログラミング言語における型(データ型)の1つで、メモリ領域が重なり合うように割り当てられる、複数のメンバの集合体を表します。
複数のメンバが同じメモリ領域を共有するため、あるタイミングで有効なメンバは1つに限られ、同時並行で使用しなければならない値の保持には使えません。代わりに、そのタイミングで使用していないほかのメンバのためにメモリ領域を消費せずに済むため、メモリを節約する効果があります。しかし、現在有効でないメンバに誤ってアクセスするバグを起こす危険性があり、メモリが限られている環境でなければ、使用を避けることが無難といえます。
どのメンバが有効であるかを管理する機構まで備えている場合と、そのような機構がなく、プログラマーが細心の注意を払わなければならない場合があります。前者のような共用体は、タグ付き共用体やバリアント型などと呼ばれることがあります。
C言語や C++ でのソースファイル上での記述は構造体型と非常によく似ており、構造体が structキーワードを使うのに対して、共用体が unionキーワードを使うという違いしかありません。
// 共用体 SampleUnion を定義
union SampleUnion {
int a;
float b;
char c[16];
};
// 構造体 SampleStruct を定義
struct SampleStruct {
int a;
float b;
char c[16];
};
構造体では各メンバが異なるメモリ領域に配置されるのに対し、共用体では互いが重なり合うように割り当てられます。共用体のメンバのメモリアドレスは一致します。
構造体全体の大きさは、すべてのメンバの大きさを足し合わせたもの以上になりますが、共用体は一番大きいメンバの大きさ以上になります(ちょうどでなく「以上」になるのはパディングが追加されることがあるため)。
共用体では、最後に値を代入したメンバだけが有効であると考えられ、メンバa に代入したあと、メンバb の値を読み取ることで型変換を試みるプログラムには保証がありません。どのメンバが有効であるかを判定できる方法は用意されていません。
C++ では、C++17 の標準ライブラリに、バリアント型を表現した std::variant[1] が追加されており、有効なメンバを管理できます。
C言語の共用体の詳細は、C言語編「共用体」を参照してください。
Programming Place Plus のトップページへ
はてなブックマーク に保存 | Pocket に保存 | Facebook でシェア |
X で ポスト/フォロー | LINE で送る | noteで書く |
RSS | 管理者情報 | プライバシーポリシー |