内存对齐的规则如下:
1. 第一个成员在与结构体变量偏移量为 0 的地址处。
2. 其他成员变量要对齐到某个数字(对齐数)的整数倍的地址处。
对齐数 = 编译器默认的一个对齐数 与 该成员大小的 较小值 。
VS 中默认的值为 8
3. 结构体总大小为最大对齐数(每个成员变量都有一个对齐数)的整数倍。
4. 如果嵌套了结构体的情况,嵌套的结构体对齐到自己的最大对齐数的整数倍处,结构体的整
体大小就是所有最大对齐数(含嵌套结构体的对齐数)的整数倍。
struct S1
{
char c1;
int i;
char c2;
};//1+3+4+1+3=12
int main()
{
printf("%zd\n", sizeof(struct S1));
}
在举一个嵌套结构体的例子:
struct S3
{
double d;
char c;
int i;
};//8+1+3+4=16
//练习4-结构体嵌
struct S4
{
char c1;
struct S3;
double a;
};//1+7+16+8=32
int main()
{
printf("%zd\n", sizeof(struct S3));
printf("%zd\n", sizeof(struct S4));
}
S3中的最大对齐数是double字节是8,所以里面嵌套的struct S3放在内存偏移量为8的位置。
vs的默认对齐数是8,我们可以修改对齐数。
#pragma pack(4)//设置默认对齐数为4
struct S3
{
char c;
double d;
int i;
};
#pragma pack()//还原默认对齐数
如果默认对齐数是8,结构体大小是1+7+8+4+4=24
修改默认对齐数为4,结构体大小是1+3+8+4=16