离线虚拟方法

问题描述 投票:40回答:1

什么是离线虚拟方法,它为什么会影响链接时间?

LLVM Coding Standards

[如果类在头文件中定义并且具有vtable(虚拟方法或它从具有虚拟方法的类派生),该类中必须始终至少有一个离线虚拟方法。否则,编译器会将vtable和RTTI复制到每个.o中。#包含标头的文件,.o文件的大小膨胀并增加链接时间。

c++ linker virtual llvm
1个回答
47
投票

编译器必须为具有虚拟方法的类发出vtable。它包含这些方法的指针。如果所有虚拟方法都是内联的(在标头中定义),则编译器不知道要在其中转换vtable的哪个翻译单元(.cpp文件),因此它在所有虚方法中均发出一个副本,并且链接程序开始处理用它。这使得目标文件中的工作量和工作量大增。另一方面,如果在线(.cpp)中定义了虚函数,则可以在此处发出vtable,因此将只发出一个副本。这同样适用于RTTI。

© www.soinside.com 2019 - 2024. All rights reserved.