面试题答案
一键面试内存对齐规则
- 第一个成员:结构体的第一个成员在结构体变量偏移量为0的地址处。
- 其他成员:其他成员要对齐到某个对齐数的整数倍的地址处。对齐数 = 编译器默认的一个对齐数与该成员大小的较小值。在Visual Studio中,默认对齐数为8,在GCC中,默认对齐数为4。
- 结构体总体:结构体的总大小为最大对齐数(每个成员变量都有一个对齐数)的整数倍。
- 嵌套结构体:如果结构体A里嵌套结构体B,B里的第一个成员的对齐规则与A一样,结构体B作为A的成员,其对齐规则是其内部最大对齐数的整数倍,结构体A的总大小也是最大对齐数的整数倍(包括B的最大对齐数)。
示例
struct Test {
char a;
int b;
short c;
};
计算实际占用内存大小及过程
- 成员a:
char
类型大小为1字节,对齐数为1(char
大小1与默认对齐数8或4的较小值),所以a
从偏移量0开始,占用1字节。 - 成员b:
int
类型大小为4字节,对齐数为4(int
大小4与默认对齐数8或4的较小值)。由于前一个成员a
占用1字节,下一个地址偏移量为1,不是4的整数倍,需要填充3字节,使得b
从偏移量4开始,占用4字节。此时已占用8字节。 - 成员c:
short
类型大小为2字节,对齐数为2(short
大小2与默认对齐数8或4的较小值)。当前偏移量为8,是2的整数倍,c
从偏移量8开始,占用2字节。此时总占用10字节。 - 结构体总体:最大对齐数为4(
int
的对齐数),10不是4的整数倍,需要填充2字节,所以结构体Test
实际占用内存大小为12字节。