原地址:http://blog.163.com/feyeye@126/blog/static/4351010920091082551515/
struct 結構大小和順序、#progma pack參數有關係
針對字節對齊,環境使用的gccversion 3.2.2編譯器(32位x86平臺)爲例。
char 長度爲1個字節,short 長度爲2個字節,int 長度爲4個字節。
struct 子項在內存中的按順序排列,在沒有#progma pack(n)參數的情況,各個子項的對齊係數爲自己長度。
在有#progmapack(n)參數的情況,各子項的對齊係數爲min(自己長度,n);
struct 整體的對其係數爲子項對齊係數最大值
看下面的例題:
struct A{
char a; //字長1對其係數1
char b; //字長1對其係數1
char c; //字長1對其係數1
};//整體對其係數爲1
sizeof(struct A)值是
看下圖
綠色爲被填充的內存,***爲空
因此sizeof(structA)=3;
struct B {
int a; //對其係數4
char b; //對其係數1
short c; //對其係數2
};//整體對其係數4
sizeof(strcut B)值是
如圖
short c對其係數2必須和偶地址對其,int a同理也與能4的倍數地址對其。
粉色內存被結構佔用
因此
sizeof(strcut B)=8
struct C {
char b; //對其係數1
int a; //對其係數4
short c; //對其係數2
};//整體對其係數4
sizeof(struct C)的值是
如圖
int a 從4的倍數地址開始,所以開始地址是4,因爲結構整體對其係數爲4,因此short c後的兩個內存被佔用,使大小爲4的倍數。
sizeof(struct C)=12
#progma pack (2)
struct D {
char b; //對其係數min(長度=1,n=2)=1
int a; //對其係數min(長度=4,n=2)=2
short c; //對其係數min(長度=2,n=2)=2
};//整體對其係數2
sizeof(struct D)值是
如圖
#progma pack (2) 對int a的放置產生影響,
#progma pack (n) 只能取1、2、4
因此sizeof(struct D)=8
至此stuct大小討論,大致明瞭