當多個數據需要共享內存或者多個數據每次只取其一時,可以利用聯合體(union)。在C Programming Language 一書中對於聯合體是這么描述的:
1)聯合體是一個結構;
2)它的所有成員相對於基地址的偏移量都為0;
3)此結構空間要大到足夠容納最"寬"的成員;
4)其對齊方式要適合其中所有的成員;
下面解釋這四條描述:
由於聯合體中的所有成員是共享一段內存的,因此每個成員的存放首地址相對於於聯合體變量的基地址的偏移量為0,即所有成員的首地址都是一樣的。
為了使得所有成員能夠共享一段內存,因此該空間必須足夠容納這些成員中最寬的成員。對於這句“對齊方式要適合其中所有的成員”是指其必須符合所有成員的自身對齊方式。
示例:
union U { char s[9]; int n; double d; };
上面的程序中的,
s占9字節,n占4字節,d占8字節,因此其至少需9字節的空間。
然而其實際大小並不是9,用運算符sizeof測試其大小為16.
這是因為這里存在字節對齊的問題,9既不能被4整除,也不能被8整除。因此補充字節到16,這樣就符合所有成員的自身對齊了。
從這里可以看出聯合體所占的空間不僅取決於最寬成員,還跟所有成員有關系,即其大小必須滿足兩個條件:
1)大小足夠容納最寬的成員;
2)大小能被其包含的所有基本數據類型的大小所整除。