C++プログラミング・共用体(Union)の実装

C++プログラミングの基礎である共用体の実装をご紹介します。
共用体を使用することで、メモリの節約に貢献できます。


共用体とは

共用体とは様々な型のデータを同一のメモリ領域で管理する構造体のことです。
例えば以下のようなプログラムの場合、char型/short型/int型のデータは同じメモリ領域を使用することになります。

用途・どんな時に使えるの?

メモリ節約のためです。
組み込みシステムの場合、使用できるメモリ領域には限りがあり、型の違うデータをむやみに定義するのは良くありません。共用体を使用することで様々な型のデータを同じメモリ領域上で使用することができ、メモリ節約ができます。

また経験上、共用体を使用することで実装が楽になります。

例えば種類の違う構造体が3種類あり、1つの構造体として使用したい場合があります。その場合、共用体を使えば3種類の構造体を同じメモリ領域で使用することができるため、1つの構造体として使用することができます。

共用体を使用しない場合と使用した場合の比較

例えば以下のような1つのenumと3種類の構造体があります。
enumと各構造体をそれぞれ持ちたい場合、共用体を使用しない場合はEX_STRUCT_TYPE + EX_STRUCT_XXXを持つ構造体を新たに3つ定義する必要があります。

コードから分かるように、いちいち構造体を新たに定義するのは冗長であり、メモリを無駄に消費することになります。

■ 共用体を使用しない場合

共用体を使用することでこれらの問題が解決されます。
共用体の実装例は以下の通りです。

■ 共用体を使用する場合

実装の解説

C++で実装したサンプルコードを解説します。
このサンプルコードは共用体を使って型の異なるメンバを持つそれぞれの構造体を1つにまとめて使用します。

EX_STRUCT構造体でEnumであるEX_STRUCT_TYPEと共用体であるunion_pramを定義します。

EX_STRUCT_INT、EX_STRUCT_CHAR_P、EX_STRUCT_STRING構造体を共用体として扱うことで同じメモリ領域を使用することができ、使用する際はEX_STRUCT構造体として使用することができます。

使用する構造体が1つになることで実装上構造体の型を間違える心配がなくなります。
また共用体で持つ構造体が増えても、使用する構造体は変わりませんのでコードの変更量が少なくなり拡張性が良くなります。

共用体の注意点として、同じメモリ領域を使用しているため後にデータを設定すると前に設定したデータを上書きしてしまいます。設定したデータを全て管理したい場合は、共用体の配列を定義して管理することをお勧めします。サンプルコードではvector配列で管理しています。

■ ExUnion.cpp

■ request.cpp

■ request.h

サンプルコード

Visual C++ 2017で作成したサンプルコードをGitHubで公開しています。
GitHub – ExUnion

実行結果は以下の通りです。
設定前後のデータで相異無いことが確認できます。

[ 15] Start.
[ 15] EX_STRUCT_TYPE_INT:    0
[ 29] EX_STRUCT_TYPE_CHAR_P: CHAR_P
[ 44] EX_STRUCT_TYPE_STRING: STRING
[ 53] ALL_OUTPUT_UNION
[ 58]  + EX_STRUCT_TYPE_INT:     0
[ 61]  + EX_STRUCT_TYPE_CHAR_P:  CHAR_P
[ 64]  + EX_STRUCT_TYPE_STRING:  STRING
[ 34] Terminate.

参考

以下のサイトを参考にさせていただきました。
共用体 – ITエンジニアのための技術支援サイト

Cの絵本 第2版 C言語が好きになる新しい9つの扉

新品価格
¥1,490から
(2017/7/29 21:38時点)

  • このエントリーをはてなブックマークに追加

SNSでもご購読できます。

コメントを残す

*

Translate »