Find centralized, trusted content and collaborate around the technologies you use most.
Teams
Q&A for work
Connect and share knowledge within a single location that is structured and easy to search.
什么是离线虚拟方法,为什么它会影响链接时间?
LLVM 编码标准说
如果一个类在头文件中定义并且有一个 vtable(或者它有虚方法或者它派生自带有虚方法的类),那么它必须总是在类中至少有一个外联虚方法。没有这个,编译器会将 vtable 和 RTTI 复制到每个包含头文件的 .o 文件中,膨胀 .o 文件大小并增加链接时间。
编译器必须为具有虚拟方法的类发出一个 vtable。这包含指向这些方法的指针。如果所有虚拟方法都是内联的(在标头中定义),那么编译器不知道要在哪个翻译单元(.cpp 文件)中发出 vtable,因此它会在所有虚拟方法中发出一个副本,然后链接器开始处理用它。这会在目标文件中产生额外的工作和膨胀。另一方面,如果虚函数是离线定义的(在 .cpp 中),则 vtable 可以在那里发出,因此只会发出一个副本。这同样适用于 RTTI。