Singleton instance as static field vs. static variable in getInstance() method(作为静电字段的单个实例与getInstance()方法中的静电变量)
问题描述
在this thread中,关于单例实例的描述如下:
静电变量可以是getInstance()函数的静电,也可以是Singleton类中的静电。这里有一些有趣的权衡。
这些权衡是什么?我知道,如果声明为static
函数变量,则在第一次调用函数之前不会构造单例。我也读过一些关于线程安全的文章,但我不知道这到底需要什么,也不知道这两种方法在这方面有什么不同。
两者之间还有其他主要区别吗?哪种方法更好?
在我的具体示例中,我将一个工厂类设置为单例,并将实例作为static const
字段存储在类中。我没有getInstance()
方法,而是希望用户直接访问实例,如下所示:ItemFactory::factory
。默认构造函数是私有的,实例是静态分配的。
附录:重载operator()
为单例调用createItem()
方法,以便可以这样创建Item
,这个想法有多好:ItemFactory::factory("id")
?
推荐答案
这些权衡是什么?
这是最重要的注意事项:
static
数据成员在程序开始时的静电初始化过程中初始化。如果任何static
对象依赖于单例,则将存在一个static
initialization order fiasco。
函数LOCALstatic
对象在第一次调用函数时初始化。因为任何依赖单例的人都会调用该函数,所以单例将被适当地初始化,并且不会受到失败的影响。破坏仍然存在一个非常微妙的问题。如果静电对象的析构函数依赖于单例,而该对象的构造函数不依赖于单例,那么您将得到未定义的行为。
另外,函数在第一次调用时被初始化,意味着可以在静电初始化完成且main
被调用之后调用该函数。因此,该程序可能产生了多个线程。在初始化static
本地时可能存在争用条件,从而导致构造多个实例。幸运的是,从C++11开始,该标准保证初始化是线程安全的,并且这种权衡不再存在于一致性编译器中。
线程安全不是static
数据成员的问题。
哪种方法更好?
这取决于您的要求以及您支持的标准版本。
这篇关于作为静电字段的单个实例与getInstance()方法中的静电变量的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:作为静电字段的单个实例与getInstance()方法中的静电变量
基础教程推荐
- 调用std::Package_TASK::Get_Future()时可能出现争用情况 2022-12-17
- C++,'if' 表达式中的变量声明 2021-01-01
- 您如何将 CreateThread 用于属于类成员的函数? 2021-01-01
- C++ 标准:取消引用 NULL 指针以获取引用? 2021-01-01
- 设计字符串本地化的最佳方法 2022-01-01
- 什么是T&&(双与号)在 C++11 中是什么意思? 2022-11-04
- 运算符重载的基本规则和习语是什么? 2022-10-31
- 如何在 C++ 中处理或避免堆栈溢出 2022-01-01
- 如何定义双括号/双迭代器运算符,类似于向量的向量? 2022-01-01
- C++ 程序在执行 std::string 分配时总是崩溃 2022-01-01