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