为了账号安全,请及时绑定邮箱和手机立即绑定

为什么使用未命名的命名空间以及它们的好处是什么?

为什么使用未命名的命名空间以及它们的好处是什么?

C++
摇曳的蔷薇 2019-09-18 19:22:11
我刚刚加入了一个新的C ++软件项目,我正在尝试理解这个设计。该项目经常使用未命名的命名空间。例如,类定义文件中可能会出现这样的情况:// newusertype.ccnamespace {  const int SIZE_OF_ARRAY_X;  const int SIZE_OF_ARRAY_Y;  bool getState(userType*,otherUserType*);}newusertype::newusertype(...) {...可能导致使用未命名的命名空间的设计注意事项是什么?有哪些优点和缺点?
查看完整描述

3 回答

?
守着星空守着你

TA贡献1799条经验 获得超8个赞

在匿名命名空间中有一些东西意味着它是本翻译单元的本地(.cpp文件及其所有包含)这意味着如果在别处定义了具有相同名称的另一个符号,则不会违反一个定义规则(ODR)。


这与具有静态全局变量或静态函数的C方式相同,但它也可以用于类定义(并且应该使用而不是static在C ++中使用)。


同一文件中的所有匿名命名空间都被视为相同的命名空间,不同文件中的所有匿名命名空间都是不同的。匿名命名空间相当于:


namespace __unique_compiler_generated_identifer0x42 {

    ...

}

using namespace __unique_compiler_generated_identifer0x42;


查看完整回答
反对 回复 2019-09-18
?
智慧大石

TA贡献1946条经验 获得超3个赞

除了这个问题的其他答案之外,使用匿名命名空间还可以提高性能。由于命名空间中的符号不需要任何外部链接,因此编译器可以更自由地对命名空间内的代码执行积极的优化。例如,可以内联在循环中多次调用一次的函数,而不会对代码大小产生任何影响。


例如,在我的系统上,如果使用匿名命名空间,则以下代码占用大约70%的运行时间(x86-64 gcc-4.6.3和-O2;请注意,add_val中的额外代码使编译器不想包含它两次)。


#include <iostream>


namespace {

  double a;

  void b(double x)

  {

    a -= x;

  }

  void add_val(double x)

  {

    a += x;

    if(x==0.01) b(0);

    if(x==0.02) b(0.6);

    if(x==0.03) b(-0.1);

    if(x==0.04) b(0.4);

  }

}


int main()

{

  a = 0;

  for(int i=0; i<1000000000; ++i)

    {

      add_val(i*1e-10);

    }

  std::cout << a << '\n';

  return 0;

}


查看完整回答
反对 回复 2019-09-18
  • 3 回答
  • 0 关注
  • 765 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信