现代C ++中的全局变量

时间:2016-01-12 13:19:16

标签: c++ static global

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

我喜欢创建静态属性,因为我发现它们“更整洁”。 (我确切地知道它们来自哪里等等)我对命名空间不是很熟悉。我对全局变量感到不舒服,因为我不熟悉externstatic等C关键字。

此外,如果我们考虑班级

class MyStaticClass
{
    private:

        static int x;
        static double y;

    public:

        static float s;
        static double weatherForecast(unsigned int, char);
};

和命名空间

namespace MyNamespace
{
    int x;
    double y;
    float s;
    double weatherForecast(unsigned int, char);
}
  1. 调用MyStaticClass::weatherForecast和调用MyNamespace::weatherForecast之间是否存在差异(性能方面)?

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

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

1 个答案:

答案 0 :(得分:8)

  

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

这被称为" monostate"这取决于。

  

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

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

  

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

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

有一个经常被引用的误解,即翻译单元的动态初始化顺序是未定义的,所以人们过度使用单例而不是普通的全局变量来确保Singleton对象在首次使用之前被初始化。但是,有一种称为Schwarz Counter的可移植技术,用于初始化标准流(std::cout和朋友),这确保这些全局变量在第一次使用之前被初始化,甚至在main之前进入了。

更新问题的答案:不,不,不。