共用体 - データの共用
共用体は、複数のデータを共用できる型です。共用するという意味は、メンバ変数が、同じメモリ領域を使うという意味です。データを共有するという点を除いては、共用体は、構造体と同じように使うことができます。
#include <stdint.h> // 共用体 union myapp_value { int8_t i8_val; int16_t i16_val; int32_t i32_val; int64_t i64_val; float float_val; double double_val; void* ptr_val; };
メンバ変数は、一つのメモリ領域を共有しています。つまり、一度に、どれか一つしか利用できないということです。
sizeof演算子が返す共用体のサイズは、最も大きいメンバ変数のsizeof演算子が返すサイズになります。
共用体の使用
共用体を使用してみましょう。共用体は、型として利用できます。共用体を宣言して、メンバ変数に値を代入して、内容を出力しています。
#include <stdint.h> #include <stdio.h> // 書籍情報を表現する共用体の定義 union myapp_value { int8_t i8_val; int16_t i16_val; int32_t i32_val; int64_t i64_val; float float_val; double double_val; void* ptr_val; }; int main(void) { // 共用体変数の宣言 union myapp_value value; // メンバ変数i32_valueに値を代入 value.i32_val = 4; printf("i32_val: %d\n", value.i32_val); // メンバ変数double_valに値を代入 value.double_val = 2.56; printf("double_val: %f\n", value.double_val); // あら、i32_valの値は、更新されている printf("i32_val: %d\n", value.i32_val); // 共用体のサイズ printf("size of union mypp_value: %d\n", sizeof(union myapp_value)); }
共用体は何のために存在していますか?
メモリ領域を節約するためです。
「えっ、本当にそれだけ?」
はい。最適化のために、メモリを節約したい場合が実際にあり、その場合に使います。
省メモリであるということは、メモリの局所性が高まるため、パフォーマンスにも良い影響がでます。