编译器 虚拟函数调用的优化

Compiler Optimization of virtual function calls

本文关键字:优化 函数调用 虚拟 编译器      更新时间:2023-10-16

说明为什么在运行时会发生虚拟调度的最流行示例是在编译时无法确定将创建哪个派生类。例如:

Base* b = (rand() % 2 == 1 ? new Derived1() : new Derived2());

或者当它取决于用户输入时。

假设情况并非如此,并且可以在编译时完全确定基指针引用的派生类。

如果在编译时知道基类指针指向哪个派生类,编译器是否通过用适当的派生函数替换虚拟函数而不是在运行时执行 vtable 查找来优化虚函数调用

这种优化称为去虚拟化。至少Clang执行了它,请参阅此博客文章和邮件列表中的此文章。