虚函数调用的编译器优化

10

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

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

或者当它依赖于用户输入时。

假设以上情况都不是,并且在编译时可以完全确定基指针所指的派生类。

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


4
C ++允许编译器执行任何没有可观察效果的优化。如果编译器可以证明取消虚函数调用不会产生任何可观察的效果,那么编译器可以实现这种优化,但并不是必须的。 - Sam Varshavchik
5
请访问http://gcc.godbolt.org/。您可以在那里查看由各种编译器及其设置生成的二进制文件的反汇编结果,以查看是否进行了该优化。 - HolyBlackCat
3
顺带提一下,也可以在运行时按具体类型对大型集合进行排序/分离,以手动去虚拟化,从而避免虚函数调用开销,并改善针对大型集合的特别紧密循环的icache利用。 - Preet Kukreti
1个回答

13

2
GCC也可以做到。 - Piotr Siupa
1
MSVC也知道虚函数去除。 - user743414

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接