编译器优化虚函数调用

use*_*661 9 c++ virtual-functions compiler-optimization

用于说明虚拟分派在运行时发生的原因的最常见示例是在编译时无法确定将要创建哪个Derived类.例如:

Base* b = (rand() % 2 == 1 ? new Derived1() : new Derived2());
Run Code Online (Sandbox Code Playgroud)

或者当它取决于用户输入.

假设情况都不是这样,并且可以在编译时完全确定基指针引用的Derived类.

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

arr*_*owd 12

这种优化称为Devirtualization.至少Clang执行它,请参阅此博客文章和邮件列表上的这篇文章.

  • GCC也这样做。 (2认同)