未命名的命名空间和 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++ 链接器性能的主要内容,如果未能解决你的问题,请参考以下文章
窗体头文件中的“错误 C2653:系统不是类或命名空间名称”,Visual C++
什么时候适合在 C++ 中使用静态(通过未命名的命名空间)?