一、内存对齐规则
1. 第一个成员在与结构体变量偏移量为0的地址处
2. 从第二个成员开始,以后每个成员都要对齐到某个对齐数的整数倍位置
这个对齐数是自身成员大小和默认成员对齐数的较小值。
*vs环境下默认成员对齐数是8
3.当成员全部放入后,结构体的总大小必须是所有成员对齐数中最大对齐数的整数倍
#内存对齐是为了提高程序的运行效率
二、规则拆解
有这么一个结构体:
typedef struct sp
{
char n;
int a;
char c;
int b;
char N;
char M;
}qlis;
1. 第一个成员在与结构体变量偏移量为0的地址处
2.从第二个成员开始,以后每个成员都要对齐到某个对齐数的整数倍位置,这个对齐数是自身成员大小和默认成员对齐数的较小值。
*注:vs编译器默认对齐数为8
3.当成员全部放入后,结构体的总大小必须是所有成员对齐数中最大对齐数的整数倍
在上一个图中,结构体在我们看来只占18个字节。
但实际上,我们用编译器打印一下它的大小:
结果是20。因为:
三、 结构体嵌套
就是结构体A变成结构体B的成员了,A的大小就是A本身的大小。
结构体嵌套遵循上面的规则。
四、修改默认对齐数
#pragma pack( 要修改的数)
如:#pragma pack(2)
这样结构体的所有 对齐数>2 的成员都要储存到为2的倍数的地址处