面试题答案
一键面试- 结构体B的内存布局分析及大小计算
- 结构体A:
int a
通常占用4个字节。char b
占用1个字节。由于内存对齐规则,char b
后面会填充3个字节,使得结构体A的大小为8个字节(4 + 1 + 3
),这里是按照int
类型的对齐模数(4字节)进行对齐。
- 结构体B:
struct A inner
占用8个字节。double c
占用8个字节。- 结构体B的大小为16个字节(
8 + 8
),因为结构体B整体按照最大成员(double
,8字节)的对齐模数进行对齐。
- 结构体A:
- 内存对齐规则在结构体嵌套场景下的应用
- 基本规则:
- 结构体的成员变量在内存中按照声明顺序存储,但会按照一定的对齐模数进行对齐。每个成员的偏移量必须是其自身大小的整数倍。例如,
int
类型成员的偏移量必须是4的倍数,double
类型成员的偏移量必须是8的倍数等。 - 结构体的大小必须是其最大成员大小的整数倍。
- 结构体的成员变量在内存中按照声明顺序存储,但会按照一定的对齐模数进行对齐。每个成员的偏移量必须是其自身大小的整数倍。例如,
- 在结构体嵌套场景下:
- 对于结构体B中的结构体A,结构体A内部先按照自身的对齐规则进行内存布局和大小计算。
- 然后结构体B将结构体A作为一个整体成员,按照结构体B自身的对齐规则(以最大成员
double
的大小8字节为对齐模数)来确定结构体A的偏移量和结构体B的整体大小。所以结构体A的起始地址是8的倍数(这里刚好结构体A大小也是8字节,满足条件),double c
的起始地址也是8的倍数,结构体B的大小为16字节,是8的倍数。
- 基本规则:
综上所述,结构体B的大小为16字节。