Why is Singleton a better choice than Global Objects
你好,堆栈溢出。
我正在为明天的CS考试而学习,我正在看我们教授给我们准备的复习表。其中一个要点是,要知道为什么单件是比全球更好的选择。
我不太确定原因,但我记得他说过关于singleton使用更少的"名称空间污染"的话。我在谷歌上搜索了几次,比较singleton和global,但几乎所有的结果都表明两者都是糟糕的选择lol。所以这让我困惑了。
如果有人能帮我把这件事弄清楚,我将不胜感激。谢谢!
- Eww,singletons.
- Singletons are global objects though.这就像问为什么方法比成员的功能更好。
- 好吧,有一个静态的起始错误,它是一个下载,但它是伟大的。
- @Pubby I presume he means lazily-constructed singletons versus statically constructed globals.
- Hmm.On the review sheet,it says"singleton use less namspace pollution.为什么比全球要好?"
- 找到了
- 我不同意"使用最少的名称推理"I don't agree with"uses less namespace polution."肯定还有一个名字是一个全球性或单一类。名字可能不一样,但仍然是一个名称,有可能与另一个相撞。但如果这是你的监护人需要的答案,那就记住。
- @Modedlife you create one named global object containing a bunch of values and functions,instead of a bunch of functions and values that each have their own globally available name.
- @weltrampirat okay,that definitely helps.谢谢
- @Weltrampirat yes,but you'd get the same effect[assuming the functions and values belong together]from having one global object with methods and member variables-also only has one globally visible name.
- @Matspetersson并不是完全相同的效应—当全球物体自由存在的时候,这一单一的物体正处于等级的边缘。但从那以后,你是对的,赛跑。
它们是懒惰的构造:
1 2 3 4 5 6 7 8 9 10
| LargeObject global; // Large object is always constructed.
class LargeObject_Singelton
{
public: static LargeObject& getInstance()
{
static LargeObject instance; // This object is not created until the first
return instance; // time getInstance() is called.
} // If you never use it this can be important.
}; |
- 嗯,你能解释得再深入一点吗?
- 可以是懒惰的构造。如果有多个线程可能正在访问它们,那么惰性构造实际上是一个问题(因为您需要另一个全局对象来锁定对实例的第一个调用)。
- Prava:在C++ 11和C++ 03 GCC中不是真的,这不是问题。在C++ 03中,DevStuio有一些工作,但不是一个主要的问题:StaskOfFuff.COM/A/4983/14065
- @生活方式:不确定还有什么要说的。始终创建全局。只有在您需要时才创建Singelton。如果创建对象的成本很大,除非需要,否则您可能不想创建该对象。
- 懒惰的构造意味着它们在第一次调用实例函数时被实例化。这与在任何线程启动之前实例化全局b/c全局(和静态成员变量)不同。懒惰的特性使您能够控制初始化顺序(只需在主线程开始时以正确的顺序引用每个singleton的实例)。
- 如果对象很少被使用,那么懒惰的构造中只有一个好处——对于像文字处理程序中的"print"这样的函数来说,它是有意义的,但是对于"open"和"save"函数来说,它是没有意义的(不是说在一个健全的程序中,这些函数中的任何一个都是单例的——但我认为它提供了这一点)。
- 我会说,如果有一个大的对象并不总是需要的,你可以在某个时候删除它。
- @约翰.帕万:节目结束后,辛格就被正确地销毁了。你为什么要破坏那些昂贵的东西呢?这意味着你必须再次支付费用。懒惰的评估的关键是投入成本(如果你不需要它,那么就不要支付它)。