广泛使用的模板为链接器做了多少工作?

Posted

技术标签:

【中文标题】广泛使用的模板为链接器做了多少工作?【英文标题】:How much work do widely-used templates make for the linker? 【发布时间】:2014-04-29 20:03:21 【问题描述】:

假设我在 100 个不同的 cpp 文件中使用 shared_ptr<MyAwesomeClass>。编译器是否会在每个对应的 obj 中创建 shared_ptrMyAwesomeClass 特化,然后强制链接器筛选所有对象,选择一个获胜者,并删除所有失败者?

如果是这样,这种影响是否会主导链接时间,或者其他操作是否会花费更长的时间以至于无关紧要?

我正试图弄清楚为什么我的一个项目需要 100 多秒才能链接,而另一个类似大小的项目却能更快地完成。到目前为止,我发现的唯一系统性差异是,慢速模型大量使用了一些较新的标准库模板,例如 shared_ptrfunction

有问题的编译器/链接器是 Micrsoft 的 2012 版本。

【问题讨论】:

@CaptainObvlious 已修复 时髦。我讨厌做傻瓜;) 您将拥有大量的 COMDAT 部分,所有部分都具有相同的代码。链接器只选择其中一个,丢弃其余的。模板并不便宜。这是否真正解释了慢速链接并不明显。也许您可以从 /VERBOSE 选项中获得一些见解。 @CaptainObvlious,我讨厌犯一些小错误,因为这些小错误会影响到更明智的磨削,所以我很高兴能直截了当。 @HansPassant 尝试过 /VERBOSE,但并没有告诉我太多。很难说这是它的错还是我的错。 【参考方案1】:

这取决于平台,但如果确实是原因,您可以在 VS 2013 中通过 this 解决它。希望它也适用于 2012 年。请注意,它是 C++11 标准的一部分,如Obvlious 队长,所以这只是 VS 2012 是否支持它的问题。

【讨论】:

显式模板实例化不仅限于 Visual Studio,也不是特定于任何编译器的扩展,它是 C++ 核心语言的一部分。 如果您添加该文章的 VS2003 版本的链接可能会更有意义。 @user3521733 2013 版文档包括:“您可以使用 extern 关键字来防止编译器在多个对象模块中生成相同的实例化代码。”这句话在 2012 版本中明显没有,所以我不知道 extern 那里是否有这种效果。无论如何,很高兴知道我们何时/是否会进入 2013 年。

以上是关于广泛使用的模板为链接器做了多少工作?的主要内容,如果未能解决你的问题,请参考以下文章

Sql优化器究竟帮你做了哪些工作?

我们应该为亚当优化器做学习率衰减吗

模板类的链接器错误

AngularJS - 无法在链接函数中动态更改指令模板

浅谈C++编译原理 ------ C++编译器与链接器工作原理

如何将 Jquery Datatables Ellipsis 渲染器用于模板字段链接按钮?