【问题标题】:Compiler Optimization of virtual function calls虚函数调用的编译器优化
【发布时间】: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


【解决方案1】:

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

【讨论】:

  • GCC 也可以。
  • MSVC 也知道去虚拟化
猜你喜欢
  • 2017-10-03
  • 1970-01-01
  • 2020-11-25
  • 2019-04-29
  • 1970-01-01
  • 2017-06-26
  • 2020-10-19
  • 1970-01-01
相关资源
最近更新 更多