如何避免现代c++中的单例
随着c++的发展,一些在当时看起来不错的东西偶尔会显示出它们没有最初预期的那么有价值。单例就是一个例子,在这里您将学习如何在使用c++ 20、c++ 17、c++ 14或c++ 11时避免使用它们。
这一章摘自这本书
全局对象不好
全局对象不好,明白吗?你会经常听到这句话,不管是年轻的还是年老的程序员,都把它当作信条来背诵。让我们看看为什么会这样。
全局对象位于全局命名空间中。其中只有一个,因此称为“全局”。全局命名空间是翻译单元最外层的声明性区域。具有全局命名空间作用域的名称称为全局名称。任何具有全局名称的对象都是全局对象。
全局对象不一定对程序的每个翻译单元都可见;单定义规则意味着它只能在一个翻译单元中定义。然而,声明可以在任意数量的翻译单元中重复。
全局对象没有访问限制。如果你能看到它,你就能和它互动。全局对象除了程序本身之外没有其他所有者,这意味着没有单独的实体对它负责。全局对象具有静态存储持续时间,因此它们在启动时初始化(或静态初始化),在关闭时销毁(或静态去初始化)。
这是有问题的。所有权是对对象进行推理的基础。既然没有对象拥有全局对象,你怎么能在任何时候推断出它的状态呢?你可能正在调用那个对象上的函数,然后,突然间,没有任何警告,另一个实体可能会在你不知情的情况下调用那个对象上的其他函数。
更糟糕的是,由于没有对象拥有全局对象,因此它们的构造顺序不是由标准确定的。您不知道全局对象将以何种顺序构造,这将导致我们稍后将介绍的一类相当令人沮丧的bug。