繁体   English   中英

离线虚拟方法

[英]Out-of-Line Virtual Method

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

LLVM 编码标准

如果一个类在头文件中定义并且有一个虚表(要么它有虚方法,要么派生自带有虚方法的类),它必须总是在类中至少有一个外联的虚方法。 如果没有这个,编译器会将 vtable 和 RTTI 复制到每个 #includes 头的 .o 文件中,膨胀 .o 文件大小并增加链接时间。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM