面试题答案
一键面试struct B的内存布局及大小
- 内存布局:
char a
占1字节。由于结构体成员对齐原则,int b
占4字节,它需要对齐到4字节的边界,所以char a
后会填充3字节,使得int b
从4字节边界开始存储。double c
占8字节,它需要对齐到8字节边界,int b
后填充4字节,double c
从8字节对齐边界开始存储。- 整体布局为:
char a
(1字节)+ 填充(3字节)+int b
(4字节)+ 填充(4字节)+double c
(8字节)。
- 大小计算:总大小为1 + 3 + 4 + 4 + 8 = 20字节。
struct C的内存布局及大小
- 内存布局:
int b
占4字节,从4字节对齐边界开始存储。char a
占1字节,char a
后填充3字节,使得double c
能从8字节对齐边界开始存储。- 整体布局为:
int b
(4字节)+char a
(1字节)+ 填充(3字节)+double c
(8字节)。
- 大小计算:总大小为4 + 1 + 3 + 8 = 16字节。
内存布局差异及原因
- 差异:
struct B
中char a
在前,导致为了对齐int b
有较多填充字节;struct C
中int b
在前,char a
后填充字节相对较少,整体大小不同,内存布局细节不同。 - 原因:结构体的内存布局遵循成员对齐原则。每个成员都要对齐到自身大小的整数倍边界(一般情况,不同编译器可能有细微差异),结构体的总大小也要是其最大成员大小的整数倍。这种对齐方式是为了提高CPU访问内存的效率,因为CPU在读取数据时,如果数据存储在自然对齐的地址上,访问速度会更快。