面试题答案
一键面试- 虚函数表(VTable)开销
- 原因:每个包含虚函数的类都有一个虚函数表。虚函数表是一个存储类的虚函数地址的数组。这意味着即使类的实例对象没有使用虚函数,这个虚函数表也会占据内存空间。例如,假设有一个基类
Base
包含虚函数,多个派生类Derived1
、Derived2
等继承自Base
,每个类都会有自己的虚函数表(若虚函数重写情况不同)。这些虚函数表会占用一定的内存,特别是在程序中有大量包含虚函数的类时,内存开销会比较明显。
- 原因:每个包含虚函数的类都有一个虚函数表。虚函数表是一个存储类的虚函数地址的数组。这意味着即使类的实例对象没有使用虚函数,这个虚函数表也会占据内存空间。例如,假设有一个基类
- 虚函数表指针(VPtr)开销
- 原因:每个包含虚函数的类的对象都有一个虚函数表指针。这个指针指向该类对应的虚函数表,用于在运行时动态确定要调用的虚函数。对于每个对象而言,都需要额外的空间来存储这个指针。以32位系统为例,指针通常占用4字节,64位系统则占用8字节。这使得每个对象的内存大小增加,尤其是当对象本身很小时,虚函数表指针带来的额外开销占比相对较大。例如,一个简单的只包含一个
int
成员变量(在32位系统占4字节)且有虚函数的类,对象实际占用内存会因为虚函数表指针而变为8字节(假设32位系统)。
- 原因:每个包含虚函数的类的对象都有一个虚函数表指针。这个指针指向该类对应的虚函数表,用于在运行时动态确定要调用的虚函数。对于每个对象而言,都需要额外的空间来存储这个指针。以32位系统为例,指针通常占用4字节,64位系统则占用8字节。这使得每个对象的内存大小增加,尤其是当对象本身很小时,虚函数表指针带来的额外开销占比相对较大。例如,一个简单的只包含一个