面试题答案
一键面试- 派生类内存大小的确定方式:
- 在C++多重继承且涉及虚基类的场景下,派生类的内存大小由以下几部分组成:
- 各个直接基类(非虚基类部分)的成员变量大小。
- 虚基类子对象的大小。
- 为了支持虚基类而产生的额外开销,通常是一个指向虚基类子对象的指针(不同编译器实现可能不同,但常见为指针形式)。
- 派生类自身的成员变量大小。
- 可能存在的内存对齐填充字节。
- 在C++多重继承且涉及虚基类的场景下,派生类的内存大小由以下几部分组成:
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字节。
- 假设按8字节对齐(常见对齐方式)。
- Base1部分:
- 虚基类
VirtualBase
对内存大小的具体影响机制:- 减少重复:如果
Base1
和Base2
不是虚继承VirtualBase
,那么Derived
类中会存在两份VirtualBase
子对象,导致内存浪费。虚继承使得Derived
类中只存在一份VirtualBase
子对象,减少了内存占用。 - 增加指针开销:为了实现这种共享的虚基类子对象,每个直接虚继承自
VirtualBase
的类(如Base1
和Base2
)都需要一个额外的指针来指向共享的VirtualBase
子对象,这增加了一定的内存开销。但相比于重复存储虚基类子对象,整体上在多重继承场景下可能更节省内存。
- 减少重复:如果
综上所述,Derived
类的内存大小为32字节(在上述假设条件下),虚基类VirtualBase
通过减少子对象重复存储和引入指针开销来影响Derived
类的内存大小。