【发布时间】:2018-11-21 18:16:22
【问题描述】:
说明为什么虚拟调度发生在运行时的最流行的例子是在编译时无法确定要创建哪个派生类。例如:
Base* b = (rand() % 2 == 1 ? new Derived1() : new Derived2());
或者当它取决于用户输入时。
假设情况并非如此,并且可以在编译时完全确定基指针所指的派生类。
如果在编译时就知道基类指针指向哪个派生类,编译器是否会通过用适当的派生函数替换虚函数调用来优化虚函数调用,而不是在运行时进行 vtable 查找?
【问题讨论】:
-
C++ 允许编译器执行任何没有明显效果的优化。如果编译器可以证明去虚拟化函数调用不会产生明显的影响,则允许但不要求编译器实现此优化。
-
查看gcc.godbolt.org。在那里,您可以反汇编具有各种设置的各种编译器生成的二进制文件,并查看它们是否执行该优化。
-
顺便说一句,还可以通过在运行时按具体类型对大型集合进行排序/分离来手动去虚拟化,以避免虚拟调用开销并改进 icache 用于大型集合上特别紧凑的循环
标签: c++ compiler-optimization virtual-functions