鼓励内联的匿名命名空间?

问题描述 投票:0回答:1

我遇到过这种将浮点数转换为 ASCII 字符串的单文件算法,对我来说没有意义的是顶部的 注释 :

namespace { // anonymous namespace to encourage inlining

}

我一直在阅读头文件中的匿名名称空间将使该名称空间中的任何函数成为静态的,但是它对类定义(例如在本例中)有什么作用?为什么将这样的东西包装在匿名名称空间中“鼓励”人们内联它?

c++
1个回答
0
投票

未命名命名空间是一个方便的功能,可以提供名称内部链接,这意味着它们仅引用当前翻译单元中的某些内容。 (相比之下,具有外部链接的名称是指在任何翻译单元中与同名的 same 实体,而具有 no 链接的名称绝不会与其他任何地方的同名实体指代相同的实体。)

但请记住,名称的链接是一个设计决策,而不仅仅是局部优化的便利。未命名的命名空间是一种工具,但您有责任了解何时以及如何使用它。我推荐未命名命名空间的原因是因为我会将名称保留在内部除非您知道其他情况

也就是说,编译器知道由内部链接名称命名的实体不能先验地被程序的任何其他部分引用,这反过来又允许进行许多优化。内联整个函数体就是其中之一,但也存在诸如机器代码中(缺乏)可插入引用或对调用约定的担忧之类的问题。

有多种方法可以为内部链接命名,您可能会在野外看到所有这些方法。有时,如果您已经有一个提供等效行为的未命名命名空间,则可以避免其中之一,或者如果您已经通过其他方式拥有内部链接,则可以避免未命名命名空间:

  • 未命名命名空间内的事物通常具有内部链接。
  • 使用
    static
    说明符在命名空间范围内声明的名称。
  • 在命名空间范围内声明的变量具有
    const
    限定且没有
    extern
    说明符。
© www.soinside.com 2019 - 2024. All rights reserved.