zoukankan      html  css  js  c++  java
  • c++ 单例模式研究

    一篇博文:C++ 单例模式的几种实现研究 中

    看到的几段代码

    懒汉模式

     1 class Singleton
     2 {
     3 public:
     4     static Singleton* GetInstance()
     5     {
     6         if (m_pInstance == NULL )
     7         {
     8             Lock(); // 加锁
     9             if (m_pInstance == NULL )
    10             {
    11                 m_pInstance = new Singleton ();
    12             }
    13             UnLock(); // 解锁
    14         }
    15         return m_pInstance;
    16     }
    17 
    18     // 实现一个内嵌垃圾回收类    
    19     class CGarbo 
    20     {
    21     public:
    22         ~CGarbo()
    23         {
    24             if(Singleton::m_pInstance) 
    25                 delete Singleton::m_pInstance;
    26         }
    27     };
    28 
    29     static CGarbo Garbo; // 定义一个静态成员变量,程序结束时,系统会自动调用它的析构函数从而释放单例对象
    30 
    31 private:
    32     Singleton(){};
    33     Singleton(Singleton const&); 
    34     Singleton& operator=(Singleton const&); 
    35 
    36     static Singleton* m_pInstance;
    37 };
    38 
    39 Singleton* Singleton::m_pInstance = NULL;
    40 Singleton::CGarbo Garbo;

    c++11以上

     1 class Singleton
     2 {
     3 public:
     4     static Singleton* GetInstance()
     5     {
     6         Lock(); // not needed after C++0x 
     7         static Singleton instance;  
     8         UnLock(); // not needed after C++0x 
     9 
    10         return &instance;
    11     }
    12 
    13 private:
    14     Singleton() {};
    15     Singleton(const Singleton &);
    16     Singleton & operator = (const Singleton &);
    17 };

    饿汉模式

     1 class Singleton
     2 {
     3 public:
     4     static Singleton* GetInstance()
     5     {
     6         static Singleton instance;
     7         return &instance;
     8     }
     9 
    10 protected:
    11     // 辅助代理类
    12     struct Object_Creator
    13     {
    14         Object_Creator()
    15         {
    16             Singleton::GetInstance();
    17         }
    18     };
    19     static Object_Creator _object_creator;
    20 
    21     Singleton() {}
    22     ~Singleton() {}
    23 };
    24 
    25 Singleton::Object_Creator Singleton::_object_creator;

    解决跨编译单元的初始化顺序,即A生成依赖B,但是先生成A还生成B不能确定

    如果没有这种需求基础的饿汉就可以

    关于使用懒汉还是饿汉模式,博主的理解:

    如果这个单例对象构造十分耗时或者占用很多资源,比如加载插件啊, 初始化网络连接啊,读取文件啊等等,而有可能该对象程序运行时不会用到,那么也要在程序一开始就进行初始化,也是一种资源浪费吧。 所以这种情况懒汉模式(延迟加载)更好。

    如果这个单例对象在多线程高并发环境下频繁使用,性能要求较高,那么显然使用饿汉模式来避免资源竞争,提高响应速度更好。

    从中我们可以看到的是性能需求,我们用c++的需求应该就是从性能出发。所以当对对象性能要求不高时,懒汉模式推荐;性能要求高时,饿汉模式推荐。

  • 相关阅读:
    ASP.NET WebApi 文档Swagger中度优化
    ASP.NET五步打包下载Zip文件
    JavaScript——HashMap实现
    JS实现集合和ECMA6集合
    JavaScript——双向链表实现
    用JavaScript来实现链表LinkedList
    JavaScript结构三层——思想快速介绍
    浏览器自动刷新——基于Nodejs的Gulp LiveReload与VisualStudio完美结合。
    JavaScript原型OOP——你上车了吗?
    再谈JavaScript闭包及应用
  • 原文地址:https://www.cnblogs.com/lmaster/p/10521264.html
Copyright © 2011-2022 走看看