C/C++中的聯合體


C/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字節。

程序輸出如下:


這說明,內存中數據低位字節存入低地址高位字節存入高地址,而數據的地址采用它的低地址來表示


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM