c++聯合體

利用union可以用相同的存儲空間存儲不同型別的數據類型,從而節省內存空間。當訪問其內成員時可用"."和"->"來直接訪問。

 

當多個數據需要共享內存或者多個數據每次只取其一時,可以利用聯合體(union)。在C Programming Language 一書中對於聯合體是這麼描述的:
1)聯合體是一個結構;
2)它的所有成員相對於基地址的偏移量都爲0;
3)此結構空間要大到足夠容納最"寬"的成員;
4)其對齊方式要適合其中所有的成員;

演示代碼如下:

 

#include<iostream>
using namespace std;

union U1
{
	int n;
	char s[11];
	double d;
};

union U2
{
	int n;
	char s[5];
	double d;
};

int main()
{
	U1 u1;
	U2 u2;
	cout<<sizeof(u1)<<'\t'<<sizeof(u2)<<endl;
	cout<<"u1各數據地址:\n"<<&u1<<'\t'<<&u1.d<<'\t'<<&u1.s<<'\t'<<&u1.n<<endl;
	cout<<"u1各數據地址:\n"<<&u2<<'\t'<<&u2.d<<'\t'<<&u2.s<<'\t'<<&u2.n<<endl;
}

上述代碼中:

 

對於U1聯合體,s佔11字節,n佔4字節,d佔8字節,因此其至少需1字節的空間。然而其實際大小並不是11,用運算符sizeof測試其大小爲16。這是因爲這裏存在字節對齊的問題,11既不能被4整除,也不能被8整除。因此補充字節到16,這樣就符合所有成員的自身對齊了。從這裏可以看出聯合體所佔的空間不僅取決於最寬成員,還跟所有成員有關係,即其大小必須滿足兩個條件:1)大小足夠容納最寬的成員;2)大小能被其包含的所有基本數據類型的大小所整除。

對於U2聯合體,同理知道,用運算符sizeof測試其大小爲8。

 

具體運行結果如下:

從結果圖中還可以發現,聯合體中的各數據的存儲地址都是相同的。

 

上面提到了聯合體中的數據是共享相同的存儲空間。下面再研究具體每種類型數值都存儲在哪裏?

 

#include<iostream>
using namespace std;

union U
{
	unsigned int n;
	unsigned char s[4];
};

int main()
{
	U u;
	u.n = 0xf1f2f3f4;
	cout<<hex<<u.n<<'\t'<<&u.n<<endl;
	cout<<hex<<(int)u.s[0]<<'\t'<<(void*)&u.s[0]<<endl;
	cout<<hex<<(int)u.s[1]<<'\t'<<(void*)&u.s[1]<<endl;
	cout<<hex<<(int)u.s[2]<<'\t'<<(void*)&u.s[2]<<endl;
	cout<<hex<<(int)u.s[3]<<'\t'<<(void*)&u.s[3]<<endl;
}

 

上述代碼中,聯合體U中,n佔4字節,s[4]也佔4字節。故聯合體共佔4字節。

程序輸出如下:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章