Sci*_*ion 3 c++ singleton static extern
假设我们使用extern关键字有一些外部链接.
我有(在class1.cpp中):
MyClass* myClassVar = NULL;
Run Code Online (Sandbox Code Playgroud)
构造函数初始化上面的内容,析构函数删除.
然后在class2.cpp和class3.cpp中有:
extern MyClass* myClassVar;
Run Code Online (Sandbox Code Playgroud)
这些类使用myClassVar(执行通常的空检查等).
Singleton会更受青睐吗?(我知道全局变量等等,而Singleton只是语法糖).将上述代码更改为以下代码是否有优势?
static Singleton& getInstance()
{
static Singleton instance;
return instance;
}
Run Code Online (Sandbox Code Playgroud)
然后所有课程都会:
Singleton::getInstance()
Run Code Online (Sandbox Code Playgroud)
全局变量受到初始化顺序惨败的影响.单独翻译单元中的全局变量以未指定的顺序初始化,因此如果在构造函数中引用另一个,则会得到未定义的行为.
函数作用域中的静态变量在第一次调用函数时初始化,这(或多或少)解决了初始化顺序问题.
但是,仍存在更微妙的问题; 特别是,仍然有可能在对象被销毁后访问它,并且有一些开销来确保线程安全的初始化(并且在较旧的编译器中,初始化可能根本不是线程安全的).没有完全安全的方法来管理非平凡类型的全局可访问对象,我的建议是尽可能完全避免它们.