D-programming-unions
提供:Dev Guides
Dプログラミング-連合
*union* は、Dで使用可能な特別なデータ型であり、同じメモリ位置に異なるデータ型を格納できます。 多くのメンバーでユニオンを定義できますが、常に1つのメンバーのみが値を含むことができます。 ユニオンは、同じメモリ位置を複数の目的に使用する効率的な方法を提供します。
Dでの連合の定義
ユニオンを定義するには、構造を定義したときと非常によく似た方法でユニオンステートメントを使用する必要があります。 ユニオンステートメントは、プログラムに複数のメンバーを持つ新しいデータ型を定義します。 ユニオン文の形式は次のとおりです-
union [union tag] {
member definition;
member definition;
...
member definition;
} [one or more union variables];
- unionタグ*はオプションであり、各メンバー定義はint iなどの通常の変数定義です。またはfloat f;または他の有効な変数定義。 ユニオンの定義の最後で、最後のセミコロンの前に、1つ以上のユニオン変数を指定できますが、これはオプションです。 これは、3つのメンバー i 、 f 、および str を持つDataという名前の共用体型を定義する方法です-
union Data {
int i;
float f;
char str[20];
} data;
*Data* 型の変数には、整数、浮動小数点数、または文字列を格納できます。 これは、単一の変数(同じメモリ位置)を使用して複数のタイプのデータを保存できることを意味します。 要件に基づいて、ユニオン内で組み込みまたはユーザー定義のデータ型を使用できます。
ユニオンが占有するメモリは、ユニオンの最大メンバーを保持するのに十分な大きさになります。 たとえば、上記の例では、データ型は20バイトのメモリ空間を占有します。これは、これが文字列で占有できる最大の空間だからです。 次の例は、上記のユニオンが占有する合計メモリサイズを表示します-
import std.stdio;
union Data {
int i;
float f;
char str[20];
};
int main( ) {
Data data;
writeln( "Memory size occupied by data : ", data.sizeof);
return 0;
}
上記のコードをコンパイルして実行すると、次の結果が生成されます-
Memory size occupied by data : 20
組合員へのアクセス
組合のメンバーにアクセスするには、* memberアクセス演算子(。)*を使用します。 メンバーアクセス演算子は、ユニオン変数名とアクセスするユニオンメンバー間のピリオドとしてコーディングされます。 ユニオンキーワードを使用して、ユニオンタイプの変数を定義します。
例
次の例は、ユニオンの使用方法を説明しています-
import std.stdio;
union Data {
int i;
float f;
char str[13];
};
void main( ) {
Data data;
data.i = 10;
data.f = 220.5;
data.str = "D Programming".dup;
writeln( "size of : ", data.sizeof);
writeln( "data.i : ", data.i);
writeln( "data.f : ", data.f);
writeln( "data.str : ", data.str);
}
上記のコードをコンパイルして実行すると、次の結果が生成されます-
size of : 16
data.i : 1917853764
data.f : 4.12236e+30
data.str : D Programming
ここでは、変数に割り当てられた最終値がメモリ位置を占有しているため、ユニオンの i および f メンバーの値が破損していることがわかります。これが str メンバーの値が非常にうまく印刷される理由です。 。
今、私たちはユニオンを持つ主な目的である一度に1つの変数を使用する同じ例をもう一度見てみましょう-
変更された例
import std.stdio;
union Data {
int i;
float f;
char str[13];
};
void main( ) {
Data data;
writeln( "size of : ", data.sizeof);
data.i = 10;
writeln( "data.i : ", data.i);
data.f = 220.5;
writeln( "data.f : ", data.f);
data.str = "D Programming".dup;
writeln( "data.str : ", data.str);
}
上記のコードをコンパイルして実行すると、次の結果が生成されます-
size of : 16
data.i : 10
data.f : 220.5
data.str : D Programming
ここでは、一度に1つのメンバーが使用されているため、すべてのメンバーが非常にうまく印刷されています。