C++
 Computer >> コンピューター >  >> プログラミング >> C++

C/C++におけるユニオン(共用体)の目的と使い方

ユニオン(共用体)は、ユーザーが定義できるデータ型の一つです。ユニオンの最大の特徴は、すべてのメンバーが同一のメモリ領域を共有するという点にあります。そのため、ユニオン全体のサイズは、メンバーの中で最も大きい型のサイズによって決まります。2つ以上のメンバーで同じメモリ領域を使い回したい場合には、ユニオンが最適な選択となります。

ユニオンは構造体(struct)とよく似ており、変数の宣言方法も構造体とほぼ同じです。C言語では「union」というキーワードを使用してユニオンを定義します。

C言語におけるユニオンの構文

union union_name {
    member definition;
} union_variables;

各要素の意味は以下の通りです。

  • union_name − ユニオンに付ける任意の名前です。
  • member definition − メンバー変数の定義(集合)です。
  • union_variables − 定義したユニオンのオブジェクト(変数)です。

サンプルコード

以下は、C言語におけるユニオンの使用例です。

#include <stdio.h>
#include <string.h>

union Data {
    int i;
    float f;
} data, data1;

int main( ) {
    printf( "Memory size occupied by data : %d\t%d", sizeof(data), sizeof(data1));
    return 0;
}

実行結果

Memory size occupied by data : 4 4

この例では、int型とfloat型の2つのメンバーを持つユニオン「Data」を定義しています。int型もfloat型も通常は4バイトであるため、ユニオン変数「data」と「data1」のサイズはどちらも4バイトになります。この結果は、ユニオンのサイズが最も大きいメンバーのサイズによって決まるという仕組みをよく示しています。

  1. C/C++における引数の型強制(Argument Coercion)とは?仕組みとサンプルコードで解説

    本記事では、C言語およびC++における「引数の型強制(Argument Coercion)」について解説します。引数の型強制とは、関数に渡された引数の型を、コンパイラがある型から別の型へ自動的に(暗黙的に)変換する仕組みのことです。この変換は「引数の昇格ルール(argument promotion rule)」に従って行われます。つまり、より小さいデータ型の引数は、より大きいデータ型へと変換されますが、その逆の変換は行われません。なぜなら、大きなデータ型から小さなデータ型へ変換すると、データの一部が失われる(桁あふれや精度の低下が発生する)恐れがあるためです。暗黙的な型変換がどのように行われる

  2. C++で二分木を簡潔にエンコード・デコードする方法

    二分木の簡潔なエンコーディングとはここに一つの二分木があるとします。ご存知の通り、二分木の簡潔なエンコーディング(succinct encoding)とは、理論上の最低限に近い記憶領域で木の構造を表現できる手法です。構造的に異なる「n個のノードを持つ二分木」の総数は、n番目のカタラン数(Catalan number)によって表されます。nが大きくなると、この数はおよそ4^nに近づくため、エンコードには最低でも log₂(4^n) = 2n ビットが必要になります。したがって、簡潔な二分木は 2n + O(n) ビット程度で表現できることになります。たとえば、次のような二分木が入力として与えられ