cpp单例模式的实现

单例模式的意义

保证全局只会创建一个对象,比如 日志模块全局只有一个,windows的任务管理器等,这样可以避免频繁的创建销毁对象,还可以避免对共享资源的多重占用,具体例子和好处坏处看参考资料[9],不赘述

几个要考虑的问题:

  • 懒加载;;
  • 线程安全生存周期的考虑;;
  • 反序列化;;
  • 反射单例;;
  • 克隆单例

实现思想

首先是一个唯一性,保证全部成员只能访问到一个共同的对象

为了防止对象被创建多次,要把构造函数设为private,以防止被他人调用重复建立,而自己单独实现一个接口用来获取实例(可以把构造函数当作这个接口吗?),并且要把赋值函数operator=删去,拷贝构造函数会导致创建新对象也要删掉,

自己实现的接口中,防止对象地址暴露被用户delete,返回类型不能为指针,又因为删掉了拷贝构造,所以只能返回引用所以要注意get()不能返回指针类型,

不太行的方案

  1. 如果把数据用static包装,即 static singleton data,可以实现单例模式,但是缺点是在程序开始的时候初始化启动比较慢,如果没用到这个单例模式还是会占用一定的空间
  2. 如果把数据用指针存储,在getdata的时候创建,需要加锁来保证线程安全,一种方式是DCL,但是C++里volitile不像java,防止不了指令重排(如指令重排、多核处理器等问题让DCLP实现起来比较复杂),这里不赘述,见参考资料
  3. DCL在C++里可以利用barrier来实现,能防止指令重排,陈硕说这个用这个杀鸡用牛刀(可能开销太大吧)
std::atomic<Singleton*> m_instance;
Singleton* Singleton::getInstance() {
    Singleton* tmp = m_instance.
  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值