现代C++中的全局变量

Pip*_*pin 2 c++ static global

创建一个所有成员(属性,函数)都是静态的类的(目标)缺点是什么?特别是与命名空间的使用相比?或者您更愿意创建全局变量/函数?

我喜欢创建静态属性,因为我发现它们"更整洁".(我确切地知道它们来自哪里等等)我对命名空间不是很熟悉.而且我不舒服,在所有的全局变量,因为我不是很熟悉C语言的关键字,例如externstatic.

此外,如果我们考虑班级

class MyStaticClass
{
    private:

        static int x;
        static double y;

    public:

        static float s;
        static double weatherForecast(unsigned int, char);
};
Run Code Online (Sandbox Code Playgroud)

和命名空间

namespace MyNamespace
{
    int x;
    double y;
    float s;
    double weatherForecast(unsigned int, char);
}
Run Code Online (Sandbox Code Playgroud)
  1. 在通话MyStaticClass::weatherForecast和通话之间是否存在差异(性能方面)MyNamespace::weatherForecast

  2. 阅读/写作MyStaticClass::s和阅读/写作之间是否存在差异(表现方面)MyNamespace::s

  3. 如果使用类而不是主要类型,上述问题的任何答案都会改变吗?

Max*_*kin 8

创建一个所有成员(属性,函数)都是静态的类是"好习惯"吗?

这被称为"单独",它取决于.

或者您更愿意创建名称空间?

具有静态函数的类可以是模板参数,而命名空间则不能.另一方面,名称空间允许依赖于参数的查找,而类 - 则不那么.

或者您更愿意创建全局变量/函数?

有些东西是真正的全局,比如标准流,Logger对象,事件循环引擎(特定于线程的全局).例如,在每次调用中传递Logger对象或将它们存储为成员变量的代码比IMO更复杂.

经常被引用的误解是,翻译单元的动态初始化顺序是未定义的,因此人们过度使用单例而不是普通全局变量来确保Singleton对象在首次使用之前被初始化.然而,有一种称为Schwarz Counter的便携式技术,用于初始化标准流(std::cout和朋友),这确保这些全局变量在首次使用之前即使在main输入之前也被初始化.


您更新的问题的答案:不,不,不.

  • @MaximEgorushkin编译单元中静态对象的初始化顺序实际上没有明确定义.甚至在您链接到的施瓦茨计数器的动机中也说明了这一点.对普通全局变量持谨慎态度,如果它们具有非平凡的初始化,则是合理的. (2认同)