extern vs Singleton类

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)

Mik*_*our 7

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

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

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

  • 这是一个有趣的困境。作为图形程序员,我时不时地挖掘各种游戏引擎的源代码。我发现 UnrealEngine4(C++)广泛使用 extern 作为单例。现在我不确定该软件背后的工程师是业余爱好者,所以这真的让我很烦恼为什么他们更喜欢 extern 而不是静态实例单例 (2认同)

Luc*_*ore 5

既然您说您已经知道任何类型的全局变量的缺点,那么唯一的优点就是您将类的实例限制为 1,而不是使用extern,您也可以定义多个此类变量。