虚函数调用的编译器优化

Compiler Optimization of virtual function calls

说明为什么在运行时发生虚拟分派的最流行的例子是当编译时无法确定将创建哪个 Derived class。例如:

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

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

假设 none 是这种情况,并且可以在编译时完全确定基指针所指的 Derived class。

如果在编译时知道 Derived class 基 class 指针指向哪个,编译器是否优化虚函数调用 通过替换它具有适当的 Derived 函数并且在运行时不进行 vtable 查找?

这种优化称为去虚拟化。至少 Clang 执行它,请参阅 this blog post and this post on mailing list.