面试题答案
一键面试1. 内存布局分析
假设Base
类定义如下:
class Base {
public:
int a;
char b;
};
Derived
类定义如下:
class Derived : public Base {
public:
double c;
};
在C++中,派生类Derived
对象的内存布局是在基类Base
对象的内存布局之后,接着存放派生类新增的成员变量。即Derived
对象的内存布局为:先存放Base
类的int a
和char b
,然后存放Derived
类自己的double c
。
2. 内存对齐影响
内存对齐是为了提高CPU访问内存的效率。现代CPU通常以特定字节数(如4字节、8字节等)为单位来访问内存。如果数据存储的起始地址是该特定字节数的倍数,访问效率会更高。
Base
类内存对齐:int
类型通常占4字节,char
类型占1字节。由于内存对齐,char b
后会填充3字节,使得Base
类对象大小为8字节(4 + 1 + 3)。
Derived
类内存对齐:Derived
类继承自Base
类,Base
类部分大小为8字节。double
类型占8字节,其起始地址需要是8字节的倍数,刚好Base
类部分大小为8字节,满足对齐要求。所以Derived
类对象大小为8(Base
类部分) + 8(double c
) = 16字节。
3. 计算Derived
类对象大小的过程
- 计算
Base
类对象大小:int a
:4字节。char b
:1字节。- 对齐填充:为了满足
Base
类整体按4字节对齐(因为int
是4字节),char b
后填充3字节。所以Base
类对象大小为4 + 1 + 3 = 8字节。
- 计算
Derived
类对象大小:Derived
类继承Base
类,Base
类部分大小为8字节。double c
:8字节。- 由于
Base
类部分大小8字节满足double
按8字节对齐的要求,所以Derived
类对象大小为8(Base
类部分) + 8(double c
) = 16字节。
综上,Derived
类对象大小为16字节。