gpt4 book ai didi

C++ 单例 : how good is this solution? 优点/缺点,替代方案

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:33:45 24 4
gpt4 key购买 nike

我正在开发一个包含多个类的 C++ 项目,这些类必须是单例,它们之间存在依赖关系(初始化顺序很重要)。

我想出了这个解决方案:

  1. 所有我想成为单例的类都有 protected 构造函数,例如:
class MySingleton1
{
protected:
MySingleton1();
}
  1. 有一个源文件 singleton_factory.cpp 包含一个实例化类 Singletons ,它派生自所有我想成为单例的类,像这样:
#include "MySingleton1.hpp"
#include "MySingleton2.hpp"

class Singletons : public MySingleton1, public MySingleton2 {}
static Singletons s_singletons;
  1. 还是在 singleton_factory.cpp 中,对于每个单例类型,还实现了一个 getSingleton 函数的特化:
template<>
MySingleton1& getSingleton()
{
return s_singletons;
}

template<>
MySingleton2& getSingleton()
{
return s_singletons;
}
  1. getSingleton 的特殊化将“隐藏”在 singleton_factory.hpp 中的通用模板变体下:
template <class TSingleton>
TSingleton& getSingleton();

优点:

  • 低耦合:

    • Singleton 类不需要“知道”Singletons 类,只需要将其构造函数隐藏在 protected 限定符下(这甚至不是强制性的,只是一种好的做法)。唯一真正知道 Singletons 类的代码是 singleton_factory.cpp
    • 具体实例的瘦依赖:想要使用类型 T 的单例的代码只需要包含类型 T 的 header 和瘦singleton_factory。 hpp
  • 初始化顺序可以通过改变单例类的继承顺序来控制

  • 没有惰性初始化 => 线程安全?
  • getSingleton() 很快,没有 dynamic_cast,没有 reinterpret_cast

缺点:

  • 每次出现新的单例类型时,getSingleton 特化都会做同样的事情 - 即“return s_singletons;”必须添加到 singleton_factory.cpp

因此,据我所知,这实际上相当不错所以我想就此打住,但我征求您的反馈 (还有什么比编程社区更好的地方呢?)。

您认为此解决方案有哪些额外优势/劣势

您有什么替代方案建议?

最佳答案

这会迫使单例集中化,这会扰乱更复杂项目中的依赖关系。具有 singleton.cpp 的库必须依赖于每个单例所需的一切。同时,任何使用单例的人都必须依赖于singleton.cpp库。

基本上,您的代码只能在单一的非模块化项目中运行。将其扩展到多个动态库几乎是不可能的。

您的初始化顺序必须手动维护。

静态全局变量的构造点与 main 中第一个表达式之前的所有内容都是无序的。


我使用的一个不错的解决方案是创建一个动态库来保存单例内存。

要成为单例,您需要继承 CRTP 助手,它提供了一个 ::Instance() 内联方法。想要单例的人使用 ::Instance()

::Instance() 创建一个静态局部变量生命周期 token 。然后它会尝试从主 DLL 中获取单例的存储空间;如果对象已经创建,它只是将存储转换为对象类型,并增加其引用计数。

如果没有,它会创建新的存储并在其中构造对象。

在销毁静态局部变量生存期标记时,它减少了引用计数。如果该引用计数达到 0,它会在当前动态库中本地销毁它。

单例的生命周期现在是 ::Instance() 创建变量的生命周期的 union 。销毁发生在非类型删除代码中,因此我们不必担心代码被卸载的 DLL。存储是核心。存储存储的 DLL 必须低于 Singleton 系统的每个用户级别,但它又没有依赖关系,所以这不是一件痛苦的事。

这远非完美;单例和生命周期是一个持续存在的问题,因为干净的程序关闭是困难的,并且由于单例的存在而变得更加困难。但到目前为止,它在一个相当大的项目中一直有效。

关于C++ 单例 : how good is this solution? 优点/缺点,替代方案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53783561/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com