【发布时间】:2013-05-23 23:10:40
【问题描述】:
究竟什么是外联虚方法,为什么它会影响链接时间?
如果一个类在头文件中定义并且有一个 vtable(或者它有 虚拟方法或它派生自具有虚拟方法的类),它 必须始终在类中至少有一个离线虚拟方法。 没有这个,编译器会将 vtable 和 RTTI 复制到每个 .o #includes 标题的文件,膨胀的 .o 文件大小和增加 链接时间。
【问题讨论】:
究竟什么是外联虚方法,为什么它会影响链接时间?
如果一个类在头文件中定义并且有一个 vtable(或者它有 虚拟方法或它派生自具有虚拟方法的类),它 必须始终在类中至少有一个离线虚拟方法。 没有这个,编译器会将 vtable 和 RTTI 复制到每个 .o #includes 标题的文件,膨胀的 .o 文件大小和增加 链接时间。
【问题讨论】:
编译器必须为具有虚拟方法的类生成一个 vtable。这包含指向这些方法的指针。如果所有虚拟方法都是内联的(在标头中定义),那么编译器不知道在哪个翻译单元(.cpp 文件)中发出 vtable,因此它会在所有虚拟方法中发出一个副本,然后链接器开始处理用它。这会在目标文件中产生额外的工作和膨胀。另一方面,如果虚函数是离线定义的(在 .cpp 中),则 vtable 可以在那里发出,因此只会发出一个副本。这同样适用于 RTTI。
【讨论】: