外线虚拟方法

时间:2013-05-28 20:47:28

标签: c++ linker virtual llvm

外线虚拟方法究竟是什么以及为什么会影响链接时间?

http://llvm.org/docs/CodingStandards.html

  

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

1 个答案:

答案 0 :(得分:42)

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