天天看點

C++:struct和union 記憶體位元組對齊問題

struct記憶體對齊問題

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

2:結構體作為成員:如果一個結構裡有某些結構體成員,則結構體成員要從其内部最大元素大小的整數倍位址開始存儲.(struct a裡存有struct b,b裡有char,int ,double等元素,那b應該從8的整數倍開始存儲.)

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

例1.

typedef struct AA{
 int aa1;         //[]....[]
 double aa2;      //[].....[]
 float aa3;       //[]..[] 原則:結構體總大小,總長要為8的整數倍,補齊[]...[]
};
typedef struct BB
{
 char bb1[];      //[],[]
 int  bb2;         //[]...[]         
 double bb3;       //[]....[]    
 short bb4;        //[],[]        
 AA a;             //[]......[] 原則,内部對象為結構體      
 };
           

結果

24 48
           

union記憶體位元組對齊

其實union(共用體)的各個成員是以同一個位址開始存放的,每一個時刻隻可以存儲一個成員,這樣就要求它在配置設定記憶體單元時候要滿足兩點:

1.一般而言,共用體類型實際占用存儲空間為其最長的成員所占的存儲空間;

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

我們來看看這段代碼:

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

本來mm的空間應該是sizeof(int)*5=20;但是如果隻是20個單元的話,那可以存幾個double型(8位)呢?兩個半?當然不可以,是以mm的空間延伸為既要大于20,又要滿足其他成員所需空間的整數倍,即24

是以union的存儲空間先看它的成員中哪個占的空間最大,拿他與其他成員的元長度比較,如果可以整除

繼續閱讀