struct的内存对齐规则:
一、在没有pack声明的情况下:
1.计算时假设第一个元素存储的位首地址为0,之后每个元素存储的首地址都是该元素的大小的整数倍开始,比如
Struct a{
char a1;
int a2;
}
其中,a1的首地址为0,a2的首地址为4,a的总大小为8
2.若元素为结构体,则按照该结构体内部成员最大元素大小的整数倍存储,比如
Struct b{
char b1;
a b2;
}
b1的首地址为0,而b2的首地址为4,b的总大小为12
3.结构体的总大小必须在满足存储的前提下,是最大元素的整数倍
二、在有pack声明的情况下
在有pack声明的情况下,和上面不同的是,每个元素存储的首地址是pack声明的大小和自身大小中的较小者,比如
#pragma pack(2)
Struct c{
char c1;
char c2;
double c3;
}
c1的首地址为0,c2的首地址为1,c3的首地址为2,c2的首地址并不是2,因为char的大小比pack声明的2小,c3的首地址并不是8,所以c的总大小是10,而不是12