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