结构体计算大小存在内存对齐的关系,如定义一个S结构体。
struct S
{
char a;
short b;
char c;int d;
};
a占一个字节,而b占2个字节,因此b需要对齐到2的整数倍处。1地址处的空间被浪费掉,同理int占4个字节,要对齐到4的整数倍处。而最后的大小必须是最大对齐数的整数倍。这里S结构体最大对齐数是4(int),所以最后大小是占12个字节;
当一个结构体里面嵌套了个其他结构体
struct A
{
int e;
double f;
};
struct S
{
char a;
short b;
char c;
int d;
struct A;
};
a-b的总大小已经经过计算是12,而后面A对齐方式:对齐结构体A中最大对齐数的倍数;
此时结构体A中最大对齐数是8(double),那么就直接对齐到16 ,中间的地址浪费掉。
再按照内置变量对齐的规则计算得S结构体大小为32。