在32位操作系统下,有下面的的结构体定义,则sizeof(struct Test)的值为( )
struct Test{
char a; //1
int b; //8
char c; //12
short d; //12
char e; //16
char f; //16
};
- A 10
- B 12
- C 16
- D 14
答案:C
备注:题目“//”后是每一行把后面成员全注释掉时的大小。
解析:
关于sizeof(struct X),其中主要包括两种对齐填充,从第一个成员开始依次计算:
前一成员偏移量+(填充量)+当前成员大小
当前一成员偏移量不是当前成员大小的非零整数倍时,先进行一次填充,再加上当前成员大小,求到最后一个成员后,总和还需要判断是否为每一个成员大小的公倍数,若不是,则再进行一次补齐填充,补到最接近的公倍数。
例如题中求到"int b"时,首先:
char a的偏移量 = 0 + 0 + 1 = 1,
前一成员偏移量 填充量 当前成员大小
而sizeof(b)即sizeof(int) = 4,(前一成员偏移量)1 / sizeof(int) = 1 / 4 = 0,所以先进行填充,1+(填充量)3 = 4,
int b 的偏移量 = 1 + 3 + 4 = 8,
前一成员偏移量 填充量 当前成员大小
依此类推,直到最后一个成员:
char c的偏移量 = 8 + 0 + 1 = 9,
前一成员偏移量 填充量 当前成员大小
short d的偏移量 = 9 + 1 + 2 = 12,
前一成员偏移量 填充量 当前成员大小
char e的偏移量 = 12 + 0 + 1 = 13,
前一成员偏移量 填充量 当前成员大小
char f的偏移量 = 13 + 0 + 1 = 14,
前一成员偏移量 填充量 当前成员大小
最后,判断14是不是char(1),short(2),int(4)的公倍数,显然不是,加上填充量2,最终sizeof(struct Test) = 16。
下面举例计算64位操作系统下带结构体嵌套的sizeof(struct X)
struct AA{
int a;
char b;
};
struct BB{
char a;
struct AA b;
short c;
long d;
};
计算sizeof(struct BB):
char a的偏移量 = 0 + 0 + 1 = 1,
前一成员偏移量 填充量 当前成员大小
struct AA b的偏移量 = 1 + 3 + 8 = 12,
前一成员偏移量 填充量 当前成员大小
short c的偏移量 = 12 + 0 + 2 = 14,
前一成员偏移量 填充量 当前成员大小
long d的偏移量 = 14 + 2 + 8 = 24,
前一成员偏移量 填充量 当前成员大小
最后,判断24是不是char(1),short(2),long(8)的公倍数,显然是,最终sizeof(struct Test) = 24。
小结:
记录学习sizeof(struct X),欢迎交流