1.第一个成员直接对齐到相对于结构体变量起始位置为0的偏移处
2.从第二个成员开始,要对齐到该成员 大小(对齐数) 的整数倍的偏移处
3.结构体的大小为其 最大成员大小(最大对齐数) 的整数倍
4.如果一个结构体中存在嵌套结构体,则嵌套结构体对齐到自己的最大对齐数的整数倍
如一个嵌套结构体大小为16字节,其最大对齐数为8,则对齐到8的倍数,往下占16个字节
#pragma pack(n) 设置默认对齐数,设置的是全局的整个结构体的对齐数和其参数的对齐数
例题:
struct A
{
int a;
short b;
int c;
char d;
};
a占四个字节,从0开始,对齐到0,1,2,3
b占两个,从2的倍数4开始,对齐到4,5
c占四个,从4的倍数8开始,对齐到8,9,10,11
d占一个,从1的倍数12开始,对齐到12
此时总共占了13个字节,而结构体的大小为其 最大成员大小(最大对齐数) 的整数倍
最大对齐数为4,则结构体的大小为4的倍数16
若该结构体为嵌套结构体,即该结构体中存在结构体,则子结构体对齐到其最大对齐数的整数倍
struct A
{
int a;
short b;
struct B s1;
int c;
char d;
};
struct B
{
int a;
short b;
char c;
double d;
};
对B:
a占四个字节,从0开始,对齐到0,1,2,3
b占两个,从2的倍数4开始,对齐到4,5
c占一个,从1的倍数6开始,对齐到6
d占八个,从8的倍数8开始,对齐到8,9,10,11,12,13,14,15
sizeof(B)=16
对A:
a占四个字节,从0开始,对齐到0,1,2,3
b占两个,从2的倍数4开始,对齐到4,5
s1占十六个字节,其最大对齐数为,8,从8的倍数8开始,对齐到8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23
c占四个,对齐到4的倍数20开始,对齐到24,25,26,27
d占一个,对齐到28
此时A占了29个字节,其最大对齐数为8(子结构体的最大对齐数 与 自己的其他成员的最大对齐数中最大的那个),则结构体大小为8的倍数32
#pragma pack(n)设置的是整个结构体的对齐数和其参数的对齐数,当整个结构体的对齐数或其参数的对齐数 大于 n时,把对齐数改为n,比如int的对齐数是4,那它就要对齐到4的倍数,如果设置对齐数为2那它只用对齐到2的倍数
#pragma pack(2)
struct A
{
int a;
short b;
int c;
char d;
};
现在设置对齐数为2
a对齐到0,1,2,3
b对齐到4,5
此时由于4>2,所以c从2的倍数6开始,对齐到6,7,8,9
d对齐到10
结构体的大小为2的整数倍=12