getInstance() 方法中作为静态字段的单例实例与静态变量

Kon*_*tin 5 c++ singleton design-patterns static-members c++14

此线程中,有关单例实例的内容如下:

静态变量可以是 GetInstance() 函数中的静态变量,也可以是 Singleton 类中的静态变量。这里有一些有趣的权衡。

这些权衡是什么?我知道,如果声明为static函数变量,则在首次调用该函数之前不会构造单例。我还读过一些有关线程安全的内容,但我不知道这到底意味着什么,也不知道这两种方法在这方面有何不同。

两者之间还有其他主要区别吗?哪种方法更好?

在我的具体示例中,我将一个工厂类设置为单例,并将该实例存储为static const类中的字段。我没有getInstance()方法,而是希望用户直接访问实例,如下所示ItemFactory::factory:默认构造函数是私有的,并且实例是静态分配的。

operator()附录:重载调用单例的方法是个好主意createItem(),这样就Item可以像这样创建 s ItemFactory::factory("id"):?

eer*_*ika 4

这些权衡是什么?

这是最重要的考虑因素:

数据static成员在程序启动时的静态初始化期间初始化。如果任何static对象依赖于单例,那么将会出现static初始化顺序失败

函数局部static对象在函数第一次调用时被初始化。由于依赖单例的人都会调用该函数,因此单例将被适当地初始化并且不会受到失败的影响。破坏仍然存在一个非常微妙的问题。如果静态对象的析构函数依赖于单例,但该对象的构造函数不依赖于单例,那么您最终将得到未定义的行为。

此外,在第一次调用函数时初始化意味着可以在静态初始化完成并被main调用后调用该函数。因此,程序可能产生了多个线程。本地初始化时可能存在竞争条件static,导致构造多个实例。幸运的是,从 C++11 开始,该标准保证初始化是线程安全的,并且这种权衡在符合标准的编译器中不再存在。

线程安全不是static数据成员的问题。

哪种方法更好?

这取决于您的要求以及您支持的标准版本。