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
在這裏,所有的成員都得到非常好打印,因爲一個成員只在一個時間使用。