C++:struct和union 內存字節對齊問題

轉自:http://blog.csdn.net/wangyanguiyiyang/article/details/53312049

struct內存對齊問題

1:數據成員對齊規則:結構(struct)(或聯合(union))的數據成員,第一個數據成員放在offset爲0的地方,之後每一個數據成員存儲的起始位置要從該成員大小的整數倍開始(好比int在32位機爲4字節,則要從4的整數倍地址開始存儲。

2:結構體做爲成員:若是一個結構裏有某些結構體成員,則結構體成員要從其內部最大元素大小的整數倍地址開始存儲.(struct a裏存有struct b,b裏有char,int ,double等元素,那b應該從8的整數倍開始存儲.)

3:結構體總大小:也就是sizeof的結果,.必須是其內部最大成員的整數倍.不足的要補齊.

例1.

 1 typedef struct AA{
 2  int aa1;         //[0]....[3]
 3  double aa2;      //[8].....[15]
 4  float aa3;       //[16]..[19] 原則3:結構體總大小,總長要爲8的整數倍,補齊[20]...[23]
 5 };
 6 typedef struct BB
 7 {
 8  char bb1[2];      //[0],[1]
 9  int  bb2;         //[4]...[7]         
10  double bb3;       //[8]....[15]    
11  short bb4;        //[16],[17]        
12  AA a;             //[24]......[47] 原則2,內部對象爲結構體      
13  };

結果:

1 24 48

 

union內存字節對齊

 

其實union(共用體)的各個成員是以同一個地址開始存放的,每個時刻只能夠存儲一個成員,這樣就要求它在分配內存單元時候要知足兩點:

1.通常而言,共用體類型實際佔用存儲空間爲其最長的成員所佔的存儲空間;

2.如果該最長的存儲空間對其餘成員的元類型(若是是數組,取其類型的數據長度,例int   a[5]爲4)不知足整除關係,該最大空間自動延伸; 

咱們來看看這段代碼:

1 union   mm{  
2     char   a; //元長  度1  
3     int   b[5];//元長度4  
4     double   c;//元長度8  
5     int   d[3];  
6   };  

   原本mm的空間應該是sizeof(int)*5=20;可是若是隻是20個單元的話,那能夠存幾個double型(8位)呢?兩個半?

   固然不能夠,因此mm的空間延伸爲既要大於20,又要知足其餘成員所需空間的整數倍,即24 因此union的存儲空間先看它的成員中哪一個佔的空間最大,拿他與其餘成員的元長度比較,若是能夠整除

相關文章
相關標籤/搜索