gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 00:57:02 25 4
gpt4 key购买 nike

如果我在C++项目中出现这种情况:

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

编译器会生成 VTABLE 吗?

似乎没有必要,因为项目只包含 1 个 Base* 指针可能指向的类(派生),因此在所有情况下都可以在编译时解决。

如果您想为单元测试进行依赖注入(inject)但又不想在生产代码中产生 VTABLE 查找成本,这很有趣。

最佳答案

我没有硬数据,但我有充分的理由说不,它不会将虚拟调用变成静态调用。

  • 通常,编译器只看到一个编译单元。它不知道只有一个子类,因为五个月后您可能会编写另一个子类,编译它,从备份中获取一些古老的目标文件并将它们全部链接在一起。
  • 虽然链接时优化确实能看到全局,但它们通常在程序的低级表示上起作用。这种表示允许例如静态调用的内联,但不表示继承信息(可能作为可选元数据除外)并且已经明确说明了虚拟调用和 vtables。我知道 Clang 就是这种情况,IIRC gcc 的全程序优化也适用于一些低级 IR(GIMPLE?)。
  • 另请注意,使用动态加载,您可以仍然在编译和 LTO 很久之后添加更多子类。您可能不需要它,但如果我是一名编译器编写者,我会厌倦添加允许人们在非常具体、难以追踪的情况下皇家破坏虚拟调用的优化。
  • 这几乎不值得麻烦 - 如果您不需要虚拟调用(例如,因为您知道您将不再需要任何子类),请不要将内容虚拟。检查您的设计。如果您需要一些多态性但不需要虚拟的全部功能,curiously recurring template pattern可能有帮助。

关于c++ - c++中的单虚拟继承编译器优化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9140788/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com