MST

星途 面试题库

面试题:C++虚基类与派生类内存占用的基础分析

假设有一个虚基类Base,其包含一个int成员变量。然后有一个派生类Derived从Base虚继承而来,Derived自身也包含一个int成员变量。请分析并说明Derived对象的内存布局是怎样的,以及如何计算Derived对象的大小。
25.6万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试
  1. 内存布局分析
    • 由于Derived虚继承自BaseDerived对象的内存布局会相对复杂。通常,Derived对象首先会包含一个指向虚基类表(vbtable)的指针(如果编译器实现采用这种方式),该虚基类表中存储了如何定位虚基类Base子对象的信息。
    • 接着是Derived自身的int成员变量。
    • 最后是虚基类Baseint成员变量,这样设计是为了保证无论从哪个派生路径访问虚基类,都能访问到唯一的虚基类子对象。
  2. 计算Derived对象大小
    • 在32位系统下:
      • 假设指针大小为4字节,int类型大小为4字节。
      • Derived对象大小 = 虚基类表指针大小 + Derived自身int成员大小 + Baseint成员大小 = 4 + 4 + 4 = 12字节。如果考虑内存对齐(假设对齐值为4),12字节已经满足对齐要求,无需额外填充。
    • 在64位系统下:
      • 指针大小为8字节,int类型大小为4字节。
      • Derived对象大小 = 虚基类表指针大小 + Derived自身int成员大小 + Baseint成员大小 = 8 + 4 + 4 = 16字节。因为64位系统常见的对齐值为8,16字节满足对齐要求,无需额外填充。

需要注意的是,具体的内存布局和对象大小计算可能会因编译器和平台的不同而有所差异,但上述分析是一种较为常见的情况。