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 m_instance;
Singleton* Singleton::getInstance() {
    Singleton* tmp = m_instance.

你可能感兴趣的:(cpp)