sizeof [字節對齊]

怎麼判斷內存對齊規則,sizeof的結果怎麼來的,要牢記以下3條原則:(在沒有#pragma pack宏的情況下,看最後一行)

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

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

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

示例:

1. sizeof 值爲( 4 ) + 4 + 4 = 12

typedef struct Test{
  char a;   
  char b;
  int c;
  char d;
}Test;

a位於0開始,b要以1的倍數開始, c 要以4的倍數開始, d 要以1的倍數開始。整個結構體Test要以 max( 1, 4 ) 倍數開始。

2. sizeof 值爲( 8 ) + 8 + 4 + 4 + 4 = 28, 不是8的倍數,故增加到32.

typedef struct Test{
  char a;   
  double e;
  char b;
  int c;
  char d;
}Test;

a位於0開始,e要以8開始,b要以1的倍數開始, c 要以4的倍數開始, d 要以1的倍數開始。整個結構體Test要以 max( 1, 4,  8 ) 倍數開始。


在1、2中,Windows下VS默認 #pragma pack(8), 而linux下 gcc 默認 #pragma pack(4)並且只能是1、2、4。





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章