【问题标题】:Out-of-Line Virtual Method离线虚拟方法
【发布时间】:2013-05-23 23:10:40
【问题描述】:

究竟什么是外联虚方法,为什么它会影响链接时间?

LLVM Coding Standards

如果一个类在头文件中定义并且有一个 vtable(或者它有 虚拟方法或它派生自具有虚拟方法的类),它 必须始终在类中至少有一个离线虚拟方法。 没有这个,编译器会将 vtable 和 RTTI 复制到每个 .o #includes 标题的文件,膨胀的 .o 文件大小和增加 链接时间。

【问题讨论】:

    标签: c++ linker virtual llvm


    【解决方案1】:

    编译器必须为具有虚拟方法的类生成一个 vtable。这包含指向这些方法的指针。如果所有虚拟方法都是内联的(在标头中定义),那么编译器不知道在哪个翻译单元(.cpp 文件)中发出 vtable,因此它会在所有虚拟方法中发出一个副本,然后链接器开始处理用它。这会在目标文件中产生额外的工作和膨胀。另一方面,如果虚函数是离线定义的(在 .cpp 中),则 vtable 可以在那里发出,因此只会发出一个副本。这同样适用于 RTTI。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-10-23
      • 2013-05-01
      • 1970-01-01
      • 2011-09-30
      • 2015-09-09
      • 2011-09-05
      • 2011-01-25
      相关资源
      最近更新 更多