天天看點

sizeof計算聯合體大小問題

當多個資料需要共享記憶體或者多個資料每次隻取其一時,可以利用聯合體(union)。聯合體有幾個注意點:

1)聯合體是一個結構;

2)它的所有成員相對于基位址的偏移量都為0;

3)此結構空間要大到足夠容納最"寬"的成員;

4)其對齊方式要适合其中所有的成員;

聯合體的大小取決于它所有的成員中占有空間最大的一個成員的大小。并且對于複合資料類型,按照成員中最大成員的對齊方式對齊。

而struct結構體與類則需要計算所表示空間中所有成員的大小之和。

示範代碼如:

  1. #include<iostream>  
  2. using namespace std;  
  3. union U1  
  4. {  
  5.     int n;  
  6.     char s[11];  
  7.     double d;  
  8. };  

聯合體U1中,n占4位元組,s[11]占11位元組(因為一個char類型的資料占一個位元組),d占8位元組。那麼聯合體的大小取決于最大成員的大小即為11位元組,但要考率最大位元組的對齊方式,則在本例中最大位元組為double類型的8位元組,是以聯合體要擴充成8位元組的倍數,離11最接近的位元組數,即為16位元組。是以聯合體的大小為16位元組。

對齊是可以更改的,使用#pragma pack(x)可以改變編譯器的對齊方式。C++固有類型的對齊取編譯器對齊方式與自身大小中較小的一個。拿上面的代碼為例:

  1. #include<iostream>  
  2. using namespace std;  
  3. #pragma pack(2)  
  4. union U1  
  5. {  
  6.     int n;  
  7.     char s[11];  
  8.     double d;  
  9. };  

由于使用手動更改對齊方式為2,是以double的對齊也變成了2(double本身的對齊為8),是以此時sizeof(u1)=12.

繼續閱讀