未命名的命名空间中的全局非静态变量

dru*_*sta 3 c++ namespaces

我找不到关于未命名命名空间中的全局非静态变量的好解释.我尽可能地避免全局变量.在这个特殊情况下,我对纯粹理论方面的行为感兴趣.

假设以下代码:

在啊

namespace ai {
  class Widget {
    void DoSomething(int param);
  };
}
Run Code Online (Sandbox Code Playgroud)

在a.cc

namespace {
  int x;
  void Helper() {
  }
}

namespace ai {
  void Widget::DoSomething(int param) {
    x = param;
    Helper();
  }
}
Run Code Online (Sandbox Code Playgroud)
  1. 如果我要创建同一个类Widget的两个实例,两个实例是否会共享相同的变量x?

  2. 如果类实例与不同的线程在同一个线程上,那么上述行为是否相同?

  3. 如果变量x是自定义类型而不是内置类型怎么办?

  4. 当变量x将被构造并且被破坏时?

  5. sizeof(Widget)和这些变量之间有任何关系吗?

  6. C++标准中定义了哪些方面,哪些方面没有?

任何其他考虑因素,例如"需要知道"该主题?也许任何人都可以提供好书参考(例如"Effective C++ ..")来阅读更多内容?

sbi*_*sbi 5

如果我要创建同一个类Widget的两个实例,两个实例是否会共享相同的变量x?

是的.这是一个全球变量.总是有一个 - 每个过程,就是这样.

如果类实例与不同的线程在同一个线程上,那么上述行为是否相同?

全局变量是每个进程的全局变量(不是每个线程).

如果变量x是自定义类型而不是内置类型怎么办?

无所谓.(值得庆幸的是,C++在内置函数和UDT之间没有什么区别.)

当变量x将被构造并且被破坏时?

之前建造main()被称为,之后被毁坏.跨多个翻译单元构造全局变量的顺序是不确定的.在同一个TU中,它是定义的顺序.(或者声明?我忘记了.)破坏的顺序是明确定义的,并且一如既往地是逆向构造顺序.

sizeof(Widget)和这些变量之间有任何关系吗?

为什么类XY不同类型的变量之间存在关系?

C++标准中定义了哪些方面,哪些方面没有?

基本上,未命名的命名空间中的全局变量是普通的全局变量.只有它位于具有"有趣"名称的命名空间中,您无法拼写出来并且其翻译单元是唯一的.