共用体 - データの共用
共用体は、複数のデータを共用できる型です。共用するという意味は、メンバ変数が、同じメモリ領域を使うという意味です。データを共有するという点を除いては、共用体は、構造体と同じように使うことができます。
#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));
}
共用体は何のために存在していますか?
メモリ領域を節約するためです。
「えっ、本当にそれだけ?」
はい。最適化のために、メモリを節約したい場合が実際にあり、その場合に使います。
省メモリであるということは、メモリの局所性が高まるため、パフォーマンスにも良い影響がでます。
C言語ゼミ


