当前位置: 首页 > news >正文

做网站挂谷歌广告赚钱吗上海哪家优化公司好

做网站挂谷歌广告赚钱吗,上海哪家优化公司好,镇江网站建设推广,内蒙古城乡建设和住房建设厅网站单例模式就是在整个程序运行期都只有一个实例。在代码实现方面,我们要限制new出多于一个对象这种情况的发生。而不是仅仅依靠无保障的约定。 目前大多数的编程语言的做法都是私有化构造函数,对外提供一个获取实例的接口。这样做的目的使实例的创建不能在…

单例模式就是在整个程序运行期都只有一个实例。在代码实现方面,我们要限制new出多于一个对象这种情况的发生。而不是仅仅依靠无保障的约定。

目前大多数的编程语言的做法都是私有化构造函数,对外提供一个获取实例的接口。这样做的目的使实例的创建不能在类外部完成,这样我们只需要在内部保障实例只创建一次即可。我们用一个例子来说明C++的单例:

#include <iostream>
using namespace std;class TestCls{private:TestCls(){} // 构造函数私有化,在外部就无法通过new运算符创建新实例// 声明单例里的指针,static的成员在这里只是声明,它的初始化还没有完成static TestCls *m_instance;public:~TestCls(){//析构函数cout << "TestCls is destroying" << endl;}// 对外暴露一个接口获得单例static TestCls* getinstance(){if(m_instance == NULL){// new出来的对象,一定要用delete运算符删除对应的指针m_instance = new TestCls();// 巧妙的地方static MyGC mygc;}return m_instance;}void test(){cout << "test" << endl;}// 在单例里再定义一个内部类class MyGC {public:~MyGC(){//在内部类的析构函数里delete掉单例if(TestCls::m_instance){delete TestCls::m_instance;TestCls::m_instance = NULL;}}};
};// static 成员的初始化
TestCls * TestCls::m_instance = NULL;int main(){//获取单例TestCls * ptr = TestCls::getinstance();cout << ptr << endl;ptr = TestCls::getinstance();cout << ptr <<endl;return 0;
}

定义单例基本上来说是很简单的,就是先私有化构造函数,单例内部new出这个实例,并对外提供获取实例的接口。在这里我想特别分享一下,为什么要弄一个内部类的作用。

目的只有一个就是当程序退出时主动delete掉实例。其次new出来的指针要主动delete掉,malloc出来的东西要主动free掉,这些是编程的好习惯。

我在new出单例时,初始化一个内部类static MyGC mygc; 带上static关键字后,它的生命周期会一直持续到程序退出,因为这个对象不是new也不是malloc出来的,所有它就不会在堆内存里,它会在静态代码区,而单例是new出来的它就在堆内存里。在程序退出时,就会调用内部类的析构函数,这样我们就可以借此delete掉单例。这是一个很巧妙的使用。

C++单例的增强

前面的代码中我们可以看到每个线程调用getinstance()都会先判断是否空,是的话就new一个新的实例。实际上,我们可以改进一下这段代码,C++11提供了call_once的功能,就是说这个功能可以让某个函数只被调用一次。那么我们可以将创建单例的代码,抽象成一个方法,并使用这个方法只被调用一次,这能给我们带来什么好处呢?

我们上面的代码可能没有解决好在多线程中,这个单例的初始化需要互斥的问题。也就是说可能存在多个线程在同时初始化这个实例。一般的做法就是给初始化的代码块加锁,即:

m_mutex.lock();
if(m_instance == NULL){m_instance = new TestCls();static MyGC mygc;
}
m_mutex.unlock();

现在用c++11提供的call_once函数功能就可以轻松解决这个初始化需要互斥的问题。调整过的部分:

once_flag gflag;
class TestCls{private:...static void createinstance(){if(m_instance == NULL) {m_instance = new TestCls();static MyGC mygc;}}public:...static TestCls* getinstance(){call_once(gflag,createinstance);return m_instance;}......
};

我们还可以再提高一些效率:

once_flag gflag;
class TestCls{private:...static void createinstance(){if(m_instance == NULL) {m_instance = new TestCls();static MyGC mygc;}}public:...static TestCls* getinstance(){if(m_instance == NULL) { // 进一步提高效率call_once(gflag,createinstance);}return m_instance;}......
};
http://www.hrbkazy.com/news/41603.html

相关文章:

  • 美橙互联 网站备案百度热搜关键词排行榜
  • 做直播网站要哪些技术百度一下官方网页
  • 网站建设公司获得风投打字赚钱平台 学生一单一结
  • 网站做跳转会有什么影响什么优化
  • 广州大型网站建设seo怎样才能优化网站
  • 做海淘的网站做海淘的网站有哪些怎么在网络上推广
  • 深圳专业做网站专业百度怎么注册自己的店铺
  • 微信公众号的微网站怎么做的微信软文范例100字
  • 做产品网站费用吗小程序开发制作
  • 灵犀科技 网站开发佼佼者寻找客户的渠道和方法
  • 三合一网站模板青岛seo百科
  • 做的好的营销型网站有哪些内容阿里云官网首页
  • nginx网站301重定向怎么做湖南网站优化
  • 网站开发要用什么工具软件北京seo技术交流
  • 安徽合肥网络营销哪家好惠州seo外包平台
  • 湖北分行建设银行网站小程序制作
  • django网站开发案例优化网站教程
  • 做网站系统的答辩ppt范文百度营销大学
  • 广州做网站最好的公司百色seo快速排名
  • 网站建设api百度客户管理系统登录
  • 做b2b比较好的网站海外引流推广平台
  • 移动网站开发服务网站seo方案策划书
  • 省住房和城乡建设厅官方网站广告买卖网
  • 济南网站建设认可搜点网络能百度指数的使用
  • 导航网站优化网站推广属于哪些
  • 虚拟主机建设二个网站友情链接网站大全
  • 保定专业做网站的公司客户管理软件哪个好用
  • 常州网站建设最易人民日报最新消息
  • 网站建设的可用性软文推广有哪些
  • 给政府做网站排名前十的小说