MST

星途 面试题库

面试题:C++ 多重继承下虚基类对派生类内存大小的复杂影响

在 C++ 的多重继承场景中,涉及虚基类时,派生类的内存大小是如何确定的?分析以下代码中派生类 `Derived` 的内存布局,并说明虚基类 `VirtualBase` 对其内存大小的具体影响机制。 ```cpp class VirtualBase { int data; }; class Base1 : virtual public VirtualBase { int base1Data; }; class Base2 : virtual public VirtualBase { int base2Data; }; class Derived : public Base1, public Base2 { int derivedData; }; ```
25.6万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试
  1. 派生类内存大小的确定方式
    • 在C++多重继承且涉及虚基类的场景下,派生类的内存大小由以下几部分组成:
      • 各个直接基类(非虚基类部分)的成员变量大小。
      • 虚基类子对象的大小。
      • 为了支持虚基类而产生的额外开销,通常是一个指向虚基类子对象的指针(不同编译器实现可能不同,但常见为指针形式)。
      • 派生类自身的成员变量大小。
      • 可能存在的内存对齐填充字节。
  2. Derived类的内存布局分析
    • Base1部分
      • Base1类有一个int类型的成员变量base1Data,大小为4字节(假设int为4字节)。由于Base1虚继承自VirtualBase,会有一个指向虚基类VirtualBase子对象的指针(假设指针大小为8字节,64位系统)。所以Base1部分大小至少为4 + 8 = 12字节。
    • Base2部分
      • Base2类有一个int类型的成员变量base2Data,大小为4字节。同样因为虚继承自VirtualBase,也会有一个指向虚基类VirtualBase子对象的指针,大小为8字节。所以Base2部分大小至少为4 + 8 = 12字节。
    • Derived自身部分
      • Derived类有一个int类型的成员变量derivedData,大小为4字节。
    • 虚基类VirtualBase子对象
      • VirtualBase类有一个int类型的成员变量data,大小为4字节。
    • 内存对齐
      • 假设按8字节对齐(常见对齐方式)。Base1部分12字节,Base2部分12字节,Derived自身4字节,虚基类子对象4字节。总大小为(12 + 12 + 4 + 4) = 32字节,已经满足8字节对齐,无需额外填充。所以Derived类的大小为32字节。
  3. 虚基类VirtualBase对内存大小的具体影响机制
    • 减少重复:如果Base1Base2不是虚继承VirtualBase,那么Derived类中会存在两份VirtualBase子对象,导致内存浪费。虚继承使得Derived类中只存在一份VirtualBase子对象,减少了内存占用。
    • 增加指针开销:为了实现这种共享的虚基类子对象,每个直接虚继承自VirtualBase的类(如Base1Base2)都需要一个额外的指针来指向共享的VirtualBase子对象,这增加了一定的内存开销。但相比于重复存储虚基类子对象,整体上在多重继承场景下可能更节省内存。

综上所述,Derived类的内存大小为32字节(在上述假设条件下),虚基类VirtualBase通过减少子对象重复存储和引入指针开销来影响Derived类的内存大小。