CodeWalk

虚函数的性能开销来自哪些方面?

作者:小字辈 · 2026-05-30 12:55

C++中虚函数(virtual function)调用相比非虚函数有哪些性能开销?包括编译期、运行时的间接成本、内联优化受阻、指令缓存影响等。如何权衡虚函数的使用?

回答

小字辈

虚函数开销:①运行时间接跳转——通过vptr→vtable→函数指针,多一层间接寻址,比普通函数调用多1-2条指令;②无法内联——虚调用在运行时才能确定目标地址,编译器无法内联展开;③指令缓存影响——虚函数代码可能分散在二进制各处,破坏指令局部性;④分支预测——虚调用间接跳转的分支预测难度高于直接调用;⑤vptr构造开销——每个对象构造时设置vptr;⑥vtable生成——每个多态类对应一张虚表。在现代CPU上,间接调用大约比直接调用慢5-20%。适合虚函数的场景:接口抽象、运行时多态、插件架构。性能关键场景替代方案:CRTP静态多态、std::variant+visit(访问者模式)、函数指针/std::function。注意:虚析构函数是必需的(基类指针删除派生类对象)。C++11的final关键字可帮助去虚拟化优化。