未命名的命名空间和 Visual C++ 链接器性能

Posted

技术标签:

【中文标题】未命名的命名空间和 Visual C++ 链接器性能【英文标题】:Unnamed namespaces and Visual C++ linker performance 【发布时间】:2014-04-09 08:31:28 【问题描述】:

将代码放入未命名的命名空间是否会以任何方式提高链接器性能?

理论上,当链接从不同编译单元生成的目标文件时,链接器需要处理的数据较少。但是,VC++ 链接器的性能是否真的受益于将我的代码放在未命名的命名空间中?

【问题讨论】:

如果有任何性能差异,我认为是轻微的,最好使用自我解释的命名空间,这样代码会清晰,否则你会很乱。 未命名的命名空间有一个含义——它们只在这个编译单元中使用。当我使用它们时——这就是我的意图。 【参考方案1】:

我问了同样的问题here,得到了微软代表的以下回答:

这样最多可以节省一些符号查找时间。我想这是 合理地期望符号查找使用哈希表或其他 足够高效的数据结构和符号的数量不 显着影响链接时间。

此外,快速浏览一个包含未命名命名空间的 .obj 文件 表明这样一个命名空间的成员仍然有外部链接 (这似乎是一个错误,据我所知,他们应该 具有内部联系),因此它们仍然有助于全球范围 符号表。

因此,即使它可以节省构建“具有参与跨 obj 文件链接的符号的哈希表”的时间,也没有关系,因为这些符号仍被标记为参与外部链接。

【讨论】:

this blog post 表示导出的符号数量确实会严重影响链接器的性能。 (当然,如果符号被导出无论如何,显然这两种方式都没有关系)

以上是关于未命名的命名空间和 Visual C++ 链接器性能的主要内容,如果未能解决你的问题,请参考以下文章

C++不使用匿名命名空间实现内部链接

窗体头文件中的“错误 C2653:系统不是类或命名空间名称”,Visual C++

什么时候适合在 C++ 中使用静态(通过未命名的命名空间)?

C++ 项目相关知识命名空间

C++ Primer 5th笔记(chap 18 大型程序工具)未命名的命名空间unnamednamespace

为啥要将类型放在未命名的命名空间中?