標籤:共用 程式 代碼 結果 它的 text cpp end c/c++
利用union可以用相同的儲存空間儲存不同型別的資料類型,從而節省記憶體空間。當訪問其內成員時可用"."和"->"來直接存取。
當多個資料需要共用記憶體或者多個資料每次只取其一時,可以利用聯合體(union)。在C Programming Language 一書中對於聯合體是這麼描述的:
1)聯合體是一個結構;
2)它的所有成員相對於基地址的位移量都為0;
3)此結構空間要大到足夠容納最"寬"的成員;
4)其對齊要適合其中所有的成員;
示範代碼如下:
[cpp] view plaincopyprint?
- #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)大小能被其包含的所有基礎資料型別 (Elementary Data Type)的大小所整除。
對於U2聯合體,同理知道,用運算子sizeof測試其大小為8。
具體運行結果如下:
從結果圖中還可以發現,聯合體中的各資料的儲存地址都是相同的。
上面提到了聯合體中的資料是共用相同的儲存空間。下面再研究具體每種類型數值都儲存在哪裡?
[cpp] view plaincopyprint?
- #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位元組。
程式輸出如下:
這說明,記憶體中資料低位位元組存入低地址,高位位元組存入高地址,而資料的地址採用它的低地址來表示。
C/C++中的聯合體