共用体 - データの共用

共用体は、複数のデータを共用できる型です。共用するという意味は、メンバ変数が、同じメモリ領域を使うという意味です。データを共有するという点を除いては、共用体は、構造体と同じように使うことができます。

#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));
}

共用体は何のために存在していますか?

メモリ領域を節約するためです。

「えっ、本当にそれだけ?」

はい。最適化のために、メモリを節約したい場合が実際にあり、その場合に使います。

省メモリであるということは、メモリの局所性が高まるため、パフォーマンスにも良い影響がでます。

関連情報