MST

星途 面试题库

面试题:C++ struct内存布局与成员对齐

struct B { char a; int b; double c; }; struct C { int b; char a; double c; }; 请分别阐述struct B和struct C实例化对象的内存布局差异,为什么会有这样的差异,并且计算出它们各自的大小。
14.4万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试

struct B的内存布局及大小

  1. 内存布局
    • 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字节)。
  2. 大小计算:总大小为1 + 3 + 4 + 4 + 8 = 20字节。

struct C的内存布局及大小

  1. 内存布局
    • int b 占4字节,从4字节对齐边界开始存储。char a 占1字节,char a 后填充3字节,使得 double c 能从8字节对齐边界开始存储。
    • 整体布局为:int b(4字节)+ char a(1字节)+ 填充(3字节)+ double c(8字节)。
  2. 大小计算:总大小为4 + 1 + 3 + 8 = 16字节。

内存布局差异及原因

  1. 差异struct Bchar a 在前,导致为了对齐 int b 有较多填充字节;struct Cint b 在前,char a 后填充字节相对较少,整体大小不同,内存布局细节不同。
  2. 原因:结构体的内存布局遵循成员对齐原则。每个成员都要对齐到自身大小的整数倍边界(一般情况,不同编译器可能有细微差异),结构体的总大小也要是其最大成员大小的整数倍。这种对齐方式是为了提高CPU访问内存的效率,因为CPU在读取数据时,如果数据存储在自然对齐的地址上,访问速度会更快。