C++如何链接模板实例

imp*_*dio 14 c++ templates hyperlink

如果我在由两个不同的转换单元包含的头文件中定义一个函数(可能是一个类成员函数但没有内联),我会得到一个链接错误,因为该函数是多次定义的.模板不是这样,因为它们不是可编译的类型,直到编译器解析模板化类型的对象的声明.这让我意识到我不知道编译模板代码所在的位置以及它是如何链接的,因为C++不只是创建多个代码副本来定义SomeTemplateClass.任何信息,将不胜感激.谢谢!

APr*_*mer 29

C++编译器使用了3种实现方案:

  • 贪婪实例化,编译器在每个使用它的编译单元中生成实例化,然后链接器抛弃除了其中一个之外的所有实例(这不仅仅是代码大小优化,它是必需的,以便函数地址,static变量等是独一无二的).这是最常见的模型.

  • 查询实例化,其中编译器具有已完成实例化的数据库.当需要实例化时,将检查并更新DB.我知道唯一使用它的编译器是Sun的,默认情况下不再使用它.

  • 迭代实例化,其中实例化由链接器进行(直接或通过将它们分配给编译单元,然后将重新编译).这是CFront使用的模型 - 即历史上它是第一个使用的模型 - 以及使用EDG前端的编译器(与CFront相比有一些优化).

(参见C++模板,David Vandevoorde和Nicolai Josuttis的完整指南.另一个在线参考是http://www.bourguet.org/v2/cpplang/export.pdf,它更关注编译模型,但仍然有描述实例化机制).


Edw*_*nge 0

它实际上确实创建了多个副本。这些副本很特殊,不违反单一定义规则。一些链接器会出现,删除副本,并使用它们重新链接函数;并非所有人都这样做。