分类: LINUX
2012-10-13 10:39:37
struct 子项在内存中的按顺序排列,在没有#progma pack(n)参数的情况,各个子项的对齐系数为自己长度;在有#progma pack(n)参数的情况,各子项的对齐系数为min(自己长度,n)。struct 整体的对齐系数为子项对齐系数最大值。
看下面的例题:
例题一:
struct A{
char a; //字长1,对齐系数1
char b; //字长1,对齐系数1
char c; //字长1,对齐系数1
};//整体对齐系数为1
sizeof(struct A)值是
看下图
绿色为被填充的内存,黄色为空
因此sizeof(struct A)=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