面试题答案
一键面试- 内存布局分析:
- 虚基类A部分:
- 由于A中有一个
int
成员变量,假设int
占4字节(在32位和64位系统中常见)。同时,因为B和C虚继承自A,D对象中会有一个指向虚基类A子对象的虚基表指针(vptr for virtual base)。在64位系统中,指针占8字节。所以A相关部分在D对象内存布局中,先有一个8字节的虚基表指针,接着是4字节的int
变量,共12字节。
- 由于A中有一个
- 类B部分:
- B有一个
double
成员变量,double
通常占8字节。
- B有一个
- 类C部分:
- C同样有一个
double
成员变量,占8字节。
- C同样有一个
- 类D部分:
- D有一个
char
成员变量,char
占1字节。
- D有一个
- 虚基类A部分:
- 内存对齐:
- 内存对齐原则是为了提高内存访问效率,数据成员存储的起始地址要对齐到该数据成员大小的整数倍。
- 在这个例子中,最大基本数据类型是
double
,占8字节。所以整个D对象的内存大小要对齐到8字节的整数倍。
- 计算D对象大小的过程:
- 前面分析的A部分12字节,B部分8字节,C部分8字节,D部分1字节,总共是12 + 8 + 8 + 1 = 29字节。
- 由于要对齐到8字节的整数倍,29字节向上取整到8的倍数,即32字节。
所以,D对象的大小为32字节。