虚函数(virtual function)指的是 C++ 中使用 virtual
关键字声明的函数。从表面看起来仅仅是一个函数的声明,但是其背后有着一套较为复杂的机制,通过这套机制能为 C++ 引入一些高级的动态特性。
- 函数的动态绑定
- 运行时类型识别
1. 函数的动态绑定
2. 运行时类型识别
3. 虚函数机制开销
虚函数机制为 C++ 引入一些动态特性。然而,这种机制也带来了一定的开销,主要体现在以下几个方面:
- 虚函数表的维护:每个包含虚函数的类都有一个虚函数表(vtable),这是一个指针数组,数组中的每个指针指向一个虚函数的实现。在对象的实例化过程中,需要为每个对象分配和初始化虚函数表指针,这会增加内存开销,通常占用一个指针大小的空间,在 64 位系统中,需要 8 字节(64位指针)。
- 函数调用的开销:调用虚函数时,会通过虚函数表来查找实际要调用的函数地址,这引入了额外的间接访问开销。与直接调用函数相比,这种查找过程会稍微慢一些,因为它需要进行以下几步:
- 访问对象的虚函数表指针
- 根据虚函数在虚函数表中的偏移量访问虚函数表
- 从虚函数表中读取函数地址并调用函数
- 可能影响的优化:静态绑定可以在编译时确定具体调用哪个函数,从而进行内联优化。然而,对于虚函数调用,编译器在编译时无法确定具体的函数实现,只能在运行时通过虚函数表进行解析,导致某些优化机会的丧失。