構造体と共用体の違いがわかり難かったので自分がわかるようにまとめてみる。
構造体
構造体は複数のデータ型のメンバから構成された、新しいデータ型を定義するために使用する。そのため確保するメモリの大きさはそれぞれのメンバが独自の記憶領域を確保するのでメモリの消費量が多くなる。フラグなどを管理するときはビットフィールドを使うとメモリの消費につながる。もし構造体(data)が存在する場合メモリの確保は以下のようになる。
struct { int a; char b; double c; } data;
- int a 4バイト
- char b 1バイト
- double c 8バイト
合計で約13バイト程メモリを消費する。
共用体
共用体は、構造体と似ているが複数のメンバが一つの領域を確保する。共用体のサイズは、コンパイル時には決まっていて一番大きなメンバの大きさになる。もし共用体(data 先ほどの同じ構造)が存在する場合メモリの確保は以下のようになる。
union { int a; char b; double c; } data;
- 8バイト ( int a, char b, double c )
わかりにくいが一番大きなメンバの要素が確保されるのでこの場合一番大きいdoubleの8バイト分メモリに確保される。この8バイトは共用なので例えばaへ3を代入した後doubleへ24.652などを格納するとaの値は消えdoubleの値へ入れ替わる。そのため一つのメンバの値を変更すると他のメンバの値は消される。