スタイルがズレているのはスキンのリファクタリング中だからです。

構造体と共用体のメモリ確保の違い

この記事は約2分で読めます。
スポンサーリンク

C/C++ には「構造体」と「共用体」があります。このメモリ確保についてです。

宣言文

構造体は struct 、共用体は union です。

// 構造体
public struct Type {
}

// 共用体
public union Type {
}

宣言文に変わりはありません。

構造体のメモリ確保

double [d][d][d][d] [d][d][d][d] [d][d][d][d] [d][d][d][d]
int    [i][i][i][i]
bool   [b]

構造体はフィールドごとにメモリ確保を行います。そのため、各フィールドは独立しています。

double にどのような値を代入しても、 int や bool のフィールド値は変わりません。

共用体のメモリ確保

// すべてメモリは共有。使いまわす。
double [d][d][d][d] [d][d][d][d] [d][d][d][d] [d][d][d][d] // 16byte
int    [i][i][i][i] [ ][ ][ ][ ] [ ][ ][ ][ ] [ ][ ][ ][ ] // 4byte
bool   [b][ ][ ][ ] [ ][ ][ ][ ] [ ][ ][ ][ ] [ ][ ][ ][ ] // 1byte

共用体のメモリは共有です。

double が最も大きく 16bit 必要のため、まずは 16bit 確保します。
そして、その確保したメモリを、 double としても int としても bool としても使います
これが共用体です。

メモリは共有のメモリを使いまわすため、各フィールドは独立していません。
double に値を代入すると、 int や bool の値も変わってしまいます。

使い道

共用体は、各フィールドのメモリが同一のため、「 double のデータを long で読み出す」などができます。

また、フィールドが増えてもメモリの使用量は抑えられるため、低メモリで動作するプログラムなどに役立ちます。

C#の共用体

C#は構造体はありますが、共用体はありません
ただ、 FieldOffset を使えば、似たようなことは可能です。

コメント

タイトルとURLをコピーしました