c ++中的单虚拟继承编译器优化?

1 c++ performance inheritance dependency-injection vtable

如果我在C++项目中遇到这种情况:

  • 1个基类'Base'仅包含纯虚函数
  • 1个类'Derived',这是唯一从'Base'继承(public)的类

编译器会生成VTABLE吗?

似乎没有必要,因为项目只包含一个Base*指针可能指向的类(Derived),所以这可以解决所有情况下的编译时间.

如果您想为单元测试执行依赖项注入但不希望在生产代码中产生VTABLE查找成本,这很有趣.

小智 6

我没有硬数据,但我有充分的理由拒绝,它不会将虚拟调用转为静态调用.

  • 通常,编译器只能看到一个编译单元.它不可能知道只有一个子类,因为五个月后你可以编写另一个子类,编译它,从备份中获取一些古老的目标文件并将它们全部链接在一起.
  • 虽然链接时优化确实可以看到整体情况,但它们通常用于程序的低级别表示.这种表示允许例如内联静态调用,但不代表继承信息(可能除了作为可选元数据)并且已经明确地拼写了虚拟调用和vtable.我知道这是Clang和IIRC的情况gcc的整个程序优化也适用于某些低级别的IR(GIMPLE?).
  • 另请注意,通过动态加载,您可以在编译和LTO之后添加更多子类.您可能不需要它,但如果我是编译器编写者,我会厌倦添加一个优化,允许人们在非常具体,难以跟踪的情况下进行虚拟调用.
  • 这很麻烦 - 如果你不需要虚拟调用(例如,因为你知道你不需要更多的子类),不要制造东西virtual.检查你的设计.如果您需要一些多态而不是虚拟的全部功能,那么奇怪的重复模板模式可能会有所帮助.