- 对象内存布局变化:
- 当一个类包含虚拟函数时,该类的对象内存布局中会增加一个虚函数表指针(vptr)。这个指针指向一个虚函数表(vtbl),虚函数表中存储了该类及其基类所有虚函数的地址。
- 例如,假设有如下类定义:
class Base {
public:
virtual void virtualFunction() {
std::cout << "Base::virtualFunction" << std::endl;
}
};
- 在32位系统下,一个
Base
类对象的大小通常为4字节(假设指针大小为4字节,因为要存储vptr),而如果Base
类没有虚函数,其对象大小通常为0字节(在某些编译器优化下,会填充为1字节以确保对象有唯一地址)。
- 对性能的影响:
- 积极影响:
- 虚拟函数机制实现了运行时多态,使得程序设计更加灵活,能更好地应对复杂的软件需求变化,从长远来看,有助于提高代码的可维护性和可扩展性,这在一定程度上间接提升了开发效率。
- 消极影响:
- 空间开销:对象增加了vptr,会占用更多内存空间,在创建大量对象时,内存消耗会显著增加。例如,在一个游戏场景中有大量包含虚函数的游戏对象,可能会导致内存占用过高,影响游戏性能。
- 时间开销:调用虚函数时,需要通过vptr找到虚函数表,再从虚函数表中获取函数地址然后调用,相比直接调用非虚函数,增加了一次间接寻址,会带来额外的时间开销。在对性能要求极高的实时系统或高频调用的函数中,这种开销可能会比较明显。例如,在一个高频渲染循环中频繁调用虚函数,会导致渲染帧率下降。