结构体对齐的规则:
1.第一个成员在与结构体偏移量为0的地质处
2.其他成员变量要对其到某个数字(对齐数)的整数倍的地址处
对齐数 = min{编译器默认的对齐数 , 该成员空间字节大小}(vs下为8, linux下为4)
3.结构体总大小为最大对齐数(每个成员都有一个对齐数)的整数倍
4.如果出现嵌套情况,嵌套的结构体对齐到自己的最大对齐数的整数倍处,结构体的整体大小就是所有最大对齐数(含嵌套结构体的对齐数)的整数倍。
例如:
1.下面的结构体大小分别是多大(假设32位机器)?
struct A
{
char a; //1
char b; //1
char c; //1
};
//进行整体对齐,最大类型为1<对齐系数4,按1整体对齐,所以1+1+1=3
变量空间首地址:0 1 2
struct B
{
int a; //4
char b; //1
short c;//2
};
//进行整体对齐,最大类型为4=对齐系数4,所以按4整体对齐4 1+2=3<4 对齐4 所以4+4=8
变量空间首地址:0 4 6
struct C
{
char b; //1
int a; //4
short c;//2
};
//进行整体对齐,最大类型为4=对齐系数4,所以按4整体对齐 1<4(对齐4) 4=4 2<4(对齐4) 所以4+4+4=12
变量空间首地址:0 4 8
#pragma pack(2)
struct D
{
char b; //1
int a; //4
short c;//2
};
//进行整体对齐,最大类型为4>对齐系数n(2),所以按2整体对齐 1<2(对齐2)4>2(2的倍数) 2=2 所以2+4+2=8
变量空间首地址:0 2 6
2. 有一个如下的结构体:
struct A
{
long a1;
short a2;
int a3;
int *a4;
};
请问在64位编译器下用sizeof(struct A)计算出的大小是多少?
24
28
16
18
答案及解析:24
64位编译器下:指针8字节(一定不能忘记),题目不说默认4字节对齐
long a1; //8
short a2; //2 8+2=10(不是4的倍数)对齐到4的倍数12
int a3; //4 4+12=16(4的倍数)
int *a4; //8 8+16=24(4的倍数)