D語言聯合體


聯合體在D提供一個特殊的資料型別,能夠儲存不同的資料型別相同的記憶體位置。可以定義一個聯合體函有許多成員,但只有一個成員可以在任何給定的時間包含一個值。聯合體提供使用相同的儲存器位置為多用途的有效方式。

定義一個聯合體

要定義聯合體,必須使用union語句,非常相似於定義結構體中所做的。 UNION語句定義了一個新的資料型別,為專案不止一個成員。聯合體宣告的格式如下:

union [union tag]
{
   member definition;
   member definition;
   ...
   member definition;
} [one or more union variables];  

union標籤是可選的,並且每個成員的定義是正常的變數定義,比如int i; or float f;或任何其他有效的變數定義。在聯合體的定義的結尾,最後的分號之前,可以指定一個或多個聯合體變數,但它是可選的。這裡將定義名為Data聯合型別,它有三個成員 i, f, 和str:

union Data
{
   int i;
   float f;
   char  str[20];
} 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

存取聯合體成員

要存取一個聯合體的任何成員,我們使用成員存取運算子(.)成員存取運算編碼為聯合體變數名和成員,使用union關鍵字來定義聯合體型別的變數。下面是例子來解釋聯合體的用法:

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成員能很好的列印。現在,讓我們看看同樣的例子再一次在這裡我們將使用一個變數時,它是具有聯合體的主要目的:

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

在這裡,所有的成員都得到非常好列印,因為一個成員只在一個時間使用。