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")
:?
这些权衡是什么?
这是最重要的考虑因素:
数据static
成员在程序启动时的静态初始化期间初始化。如果任何static
对象依赖于单例,那么将会出现static
初始化顺序失败。
函数局部static
对象在函数第一次调用时被初始化。由于依赖单例的人都会调用该函数,因此单例将被适当地初始化并且不会受到失败的影响。破坏仍然存在一个非常微妙的问题。如果静态对象的析构函数依赖于单例,但该对象的构造函数不依赖于单例,那么您最终将得到未定义的行为。
此外,在第一次调用函数时初始化意味着可以在静态初始化完成并被main
调用后调用该函数。因此,程序可能产生了多个线程。本地初始化时可能存在竞争条件static
,导致构造多个实例。幸运的是,从 C++11 开始,该标准保证初始化是线程安全的,并且这种权衡在符合标准的编译器中不再存在。
线程安全不是static
数据成员的问题。
哪种方法更好?
这取决于您的要求以及您支持的标准版本。