[英]Out-of-Line Virtual Method
究竟什么是外联虚方法,为什么它会影响链接时间?
如果一个类在头文件中定义并且有一个虚表(要么它有虚方法,要么派生自带有虚方法的类),它必须总是在类中至少有一个外联的虚方法。 如果没有这个,编译器会将 vtable 和 RTTI 复制到每个 #includes 头的 .o 文件中,膨胀 .o 文件大小并增加链接时间。
编译器必须为具有虚方法的类发出一个 vtable。 这包含指向这些方法的指针。 如果所有虚拟方法都是内联的(在头文件中定义),那么编译器不知道哪个翻译单元(.cpp 文件)在其中发出 vtable,所以它会在所有虚拟方法中发出一个副本并且链接器开始处理用它。 这会使目标文件中的额外工作和膨胀。 另一方面,如果虚拟函数被定义为外联(在 .cpp 中),则 vtable 可以在那里发出,因此只会发出一个副本。 这同样适用于 RTTI。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.