C++ 使用未命名名称空间是否减少了链接时间?

C++ 使用未命名名称空间是否减少了链接时间?,c++,C++,假设我有一个包含许多对象文件的大型系统,链接时间是一个问题。假设我知道我系统中的许多类和函数没有在它们的翻译单元之外使用 如果我减少带有外部链接的符号数量,我的链接时间会减少,这是否合理 如果是这样,将仅在单个TU中使用的实体(例如类和函数)放入未命名的名称空间对我有好处吗?从技术上讲,具有外部链接的实体将在未命名的命名空间中保留其外部链接,但是,正如C++11标准所指出的 尽管未命名命名空间中的实体可能具有外部链接,但它们实际上是由其翻译单元特有的名称限定的,因此从任何其他翻译单元中都看不到

假设我有一个包含许多对象文件的大型系统,链接时间是一个问题。假设我知道我系统中的许多类和函数没有在它们的翻译单元之外使用

  • 如果我减少带有外部链接的符号数量,我的链接时间会减少,这是否合理
  • 如果是这样,将仅在单个TU中使用的实体(例如类和函数)放入未命名的名称空间对我有好处吗?从技术上讲,具有外部链接的实体将在未命名的命名空间中保留其外部链接,但是,正如C++11标准所指出的
  • 尽管未命名命名空间中的实体可能具有外部链接,但它们实际上是由其翻译单元特有的名称限定的,因此从任何其他翻译单元中都看不到


    链接器算法是否基于以下知识执行优化:在未命名名称空间中具有外部链接的实体在其名称空间之外不可见?

    是的,我认为这确实减少了链接时间。我认为谷歌chromium stie上的这一点: “未命名名称空间将这些符号限制在编译单元中,从而提高了函数调用成本并减少了入口点表的大小。”


    我知道这是关于Chr项目的,但是它应该适用于其他C++项目。

    < P>我不知道链接器如何能进行这样的优化,因为当链接器得到所持有的符号时,它们看起来就像普通的外部链接符号。除非链接器有关于编译器如何在匿名名称空间中修饰名称的特定信息,否则我看不到任何可以优化其工作的方法


    您是否确认您的链接器实际上是CPU绑定的,而不是I/O绑定的?如果它还没有CPU限制,那么它可能无法帮助您重新组织代码。

    也许您可以做一些基准测试,并让我们知道结果?(我的猜测是这不会有帮助,但这只是一个猜测)。限制范围和避免冲突(特别是名称空间污染)难道不足以成为充分使用匿名名称空间的充分理由吗?@delnan:可能,但这不是问题所在。假设我有一个不使用未命名名称空间的大型遗留系统,我正在寻找一种方法来减少涉及该系统的链接时间。如果我的目标是减少链接时间,那么添加未命名名称空间是否是投入时间和精力的合理方式?您确实意识到,这种行为显然非常依赖于平台和编译器,对吗?所以,如果您想真正得到答案,告诉我们您使用的编译器可能是一个好主意(我怀疑它是否会有帮助,因为很少有人知道这一点,而且它并不容易测试,但仍然如此)。就我个人而言,我怀疑链接时间会有多大变化,但这只是一个猜测。@Grizzly:我不清楚它是否一定依赖于平台。据我所知,这是一个常见的优化。我相当肯定,链接时间在某种程度上与链接器必须处理的符号数量成正比,因此,如果它可以通过指出大量外部符号本质上是内部符号来消除它们,我希望这会对链接时间产生积极影响。无论如何,我的问题是一般性的。我不是想在特定的平台上解决特定的问题,我只是想更好地理解未命名名称空间的实用性。我的猜测是,编译器可能会通过省略未命名名称空间中的符号来“优化”它输出的对象文件。这可能会减少链接器要做的工作。在我看来,对于编译器来说,从一开始就不把符号放在对象文件中是微不足道的。即使符号是I/O,也会减少符号的数量。@ MalksSOM:你会这样认为,但是C++是C++的,如果有一个角落的情况不符合这个干净的规则,我不会惊讶。链接的文档似乎在具体地讨论动态链接,但这可能仍然会对OP的问题产生影响。。。