外线虚拟方法究竟是什么以及为什么会影响链接时间?
http://llvm.org/docs/CodingStandards.html说
如果在头文件中定义了一个类并且有一个vtable(它有 它是虚拟方法,或者是从具有虚方法的类派生而来的) 必须始终在类中至少有一个外联虚拟方法。 如果没有这个,编译器会将vtable和RTTI复制到每个.o中 文件#includes标题,膨胀.o文件大小和增加 链接时间。
答案 0 :(得分:42)
编译器必须为使用虚方法的类发出vtable。这包含指向这些方法的指针。如果所有虚拟方法都是内联的(在头文件中定义),那么编译器不知道哪个翻译单元(.cpp文件)在其中发出vtable,因此它会在所有这些中发出一个副本,并且链接器会处理用它。这会在目标文件中产生额外的工作和膨胀。另一方面,如果虚拟函数是在线外定义的(在.cpp中),则可以在那里发射vtable,因此只会发出一个副本。这同样适用于RTTI。