structStudent
{
char x;
double y;
int z;
} a;
sizeof(a)=24
char 偏移量为sizeof(char) 为1的倍数
short 偏移量为sizeof(short) 为2的倍数
int、long、float 偏移量为sizeof(int/long/float) 为4的倍数
double 偏移量为sizeof(double) 为8的倍数
分析:(1)为x分配空间,其起始地址跟结构体的起始地址相同(偏移量为0,是sizeof(char)的倍数),该成员变量占用sizeof(char)=1个字节;
(2)为y分配空间,此时对于结构体的起始偏移量为1,不是sizeof(double)的倍数(最小倍数),1+8=9个字节,为了满足对齐方式,系统自动 补齐7个字节,也就是16字节的偏移量。
(3)为z分配空间,此时对于构造器的起始偏移量为16,是sizeof(int)=4的倍数,满足对齐方式,所以该成员变量sizeof(int)=4个字节。
(4)综上所述占用的总字节数为1+8+7+4=20个字节数,但是必须满足,总字节数为最大字节数的最小倍数,20并不是sizeof(double)=8的倍数,为了满足对齐方式,系统会为其补齐到最小倍数的偏移量,也就是4个字节。所以最后算出来a占的总字节数为1+8+7+4+4=24。
例如:
struct Student
{
double x;
char y;
int z;
} b;
sizeof(b)=8+1+3+4=16