extern vs Singleton类

时间:2012-09-03 12:29:28

标签: c++ static singleton extern

假设我们使用extern关键字进行了一些外部链接。

我(在class1.cpp中):

MyClass* myClassVar = NULL;

构造函数初始化上面的内容,析构函数删除。

然后在class2.cpp和class3.cpp中有:

extern MyClass* myClassVar;

这些类使用myClassVar(执行常见的空检查等)。

单身人士会被选择吗? (我知道全局变量等等,而Singleton只是语法糖)。将上述代码更改为以下代码是否有优势?

static Singleton& getInstance()
{
   static Singleton instance;

   return instance;
}

然后所有课程都会这样做:

Singleton::getInstance()

2 个答案:

答案 0 :(得分:7)

全局变量受初始化顺序惨败的影响。单独翻译单元中的全局变量以未指定的顺序初始化,因此如果在构造函数中引用另一个,则会得到未定义的行为。

函数作用域中的静态变量在第一次调用函数时初始化,这会(或多或少)解决初始化顺序问题。

但是,仍存在更微妙的问题;特别是,仍然可以在对象被销毁后访问它,并且有一些开销来确保线程安全的初始化(并且在较旧的编译器中,初始化可能根本不是线程安全的)。没有完全安全的方法来管理非平凡类型的全局可访问对象,我的建议是尽可能完全避免它们。

答案 1 :(得分:4)

因为你说你已经知道任何类型的全局变量的垮台,唯一的好处是你将类的实例限制为1,而不是使用extern,你可以在那里定义多个这种变量。