C/C++中的聯合體

來源:互聯網
上載者:User

標籤:共用   程式   代碼   結果   它的   text   cpp   end   c/c++   

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

 

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

示範代碼如下:

 

[cpp] view plaincopyprint?
  1. #include<iostream>  
  2. using namespace std;  
  3.   
  4. union U1  
  5. {  
  6.     int n;  
  7.     char s[11];  
  8.     double d;  
  9. };  
  10.   
  11. union U2  
  12. {  
  13.     int n;  
  14.     char s[5];  
  15.     double d;  
  16. };  
  17.   
  18. int main()  
  19. {  
  20.     U1 u1;  
  21.     U2 u2;  
  22.     cout<<sizeof(u1)<<‘\t‘<<sizeof(u2)<<endl;  
  23.     cout<<"u1各資料地址:\n"<<&u1<<‘\t‘<<&u1.d<<‘\t‘<<&u1.s<<‘\t‘<<&u1.n<<endl;  
  24.     cout<<"u1各資料地址:\n"<<&u2<<‘\t‘<<&u2.d<<‘\t‘<<&u2.s<<‘\t‘<<&u2.n<<endl;  
  25. }  

上述代碼中:

 

對於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?
  1. #include<iostream>  
  2. using namespace std;  
  3.   
  4. union U  
  5. {  
  6.     unsigned int n;  
  7.     unsigned char s[4];  
  8. };  
  9.   
  10. int main()  
  11. {  
  12.     U u;  
  13.     u.n = 0xf1f2f3f4;  
  14.     cout<<hex<<u.n<<‘\t‘<<&u.n<<endl;  
  15.     cout<<hex<<(int)u.s[0]<<‘\t‘<<(void*)&u.s[0]<<endl;  
  16.     cout<<hex<<(int)u.s[1]<<‘\t‘<<(void*)&u.s[1]<<endl;  
  17.     cout<<hex<<(int)u.s[2]<<‘\t‘<<(void*)&u.s[2]<<endl;  
  18.     cout<<hex<<(int)u.s[3]<<‘\t‘<<(void*)&u.s[3]<<endl;  
  19. }  

 

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

程式輸出如下:


這說明,記憶體中資料低位位元組存入低地址,高位位元組存入高地址,而資料的地址採用它的低地址來表示。

C/C++中的聯合體

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.