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

优秀企业网站欣赏店名设计谷歌推广seo

优秀企业网站欣赏店名设计,谷歌推广seo,免费源码下载,高端网站建设四川本文探讨一下智能指针和GOF设计模式的关系,如果按照设计模式的背后思想来分析,可以发现围绕智能指针的设计和实现有设计模式的一些思想体现。当然,它们也不是严格意义上面向对象的设计模式,毕竟它们没有那么分明的类层次体系&…

本文探讨一下智能指针和GOF设计模式的关系,如果按照设计模式的背后思想来分析,可以发现围绕智能指针的设计和实现有设计模式的一些思想体现。当然,它们也不是严格意义上面向对象的设计模式,毕竟它们没有那么分明的类层次体系,和GOF经典设计模式在外在形式上有所差别,重点是理解设计模式的思想在它们身上的体现,以及怎样帮助它们实现意图的。

限于篇幅,分成了几篇文章来介绍,先从对象的创建开始。

1、工厂模式

工厂模式是把创建对象和使用对象的职责分离了,它们可以控制对象的创建过程,封装了创建细节,让用户不再关心具体对象的创建过程。

C++标准库提供了一些辅助函数和辅助类来创建智能指针对象,它们都是工厂方法或者工厂类。创建unique_ptr和shared_ptr除了使用常规的构造函数之外,还提供了三个工厂方法:make_shared()、make_unique()和allocate_shared(),它们都是简单工厂方法;此外,为了能够从一个shared_ptr对象的内部,通过this指针创建一个shared_ptr对象,工厂类enable_shared_from_this<T>还提供了成员函数shared_from_this()作为工厂方法。

那么,使用工厂模式创建智能指针对象有什么好处呢?

首先,通过工厂方法可以给创建过程起一个富有表达力、自解释的名称,能有效地帮助程序员容易使用,甚至无需提供阅读文档接口,而类的构造函数必须和类名完全一样,无法能够见文知意。make_shared()和make_unique(),一看就知道是创建shared_ptr和unique_ptr对象,更具特色的是shared_from_this(),通过它的名称就应该知道这个函数是通过this指针来创建shared_ptr对象,既然有this字眼,也能知道应该是在一个类的内部使用。

其次,关注点分离,分离了创建智能指针和使用智能指针的职责,让程序员不再关心智能指针对象的创建过程,不再关心是如何创建出来的,程序员把关注点放在智能指针的使用上面,减轻了程序员的心智负担。有人说,C++有了智能指针之后,就不应该在程序中出现new和delete了,可能说的绝对了点,但显然工厂方法make_shared()和make_unique()给了他这样说的底气。

再者,工厂模式可以控制智能指针对象的创建过程,这也是核心意图,它的作用有下面几点:

1、保证在堆中创建资源对象
智能指针缺省要求管理的资源对象是在堆中创建的对象,如果把一个指向栈上创建的对象的指针,让unique_ptr或shared_ptr去管理,最后在析构时会发生异常,显然是不对的。如何避免程序员无意中犯这样错误?那么作为控制对象创建过程的工厂模式,用在这儿再合适不过了。由工厂方法来控制智能指针对象的创建过程,程序员在make_unique和make_shared工厂函数中只传递创建资源对象相关参数就行了,即保证智能指针管理的肯定是使用new操作符创建的对象,这样就保证了程序的安全性。

2、保证创建过程中资源对象不泄露
make_unique()和make_shared()能够保证资源对象的释放安全,我们稍加留意就会发现,无论是shared_ptr类还是unique_ptr类,在它们的构造函数中都没有同时初始化对象资源,对象资源是在外部使用new操作符在堆上创建之后,以裸指针的形式作为构造函数的参数来创建智能指针对象,也就是说资源对象的创建和智能指针对象的创建,它们不是一体的,它们之间是有空隙的,如果在这个间隙中有别的代码运行,并发生了异常,可能会造成资源泄漏。比如(这个例子来自Effective Modern C++ 条款21):

processWidget(std::shared_ptr<Widget>(new Widget), computePriority());

因为编译器在编译时,可能是按照下面的顺序生成代码:1、实施“new Widget”,2、执行computePriority(),3、运行std::shared_ptr构造函数。如果生成了这样的代码,并且在运行时computePriority()发生了异常,那么在第1步动态分配的Widget对象会被泄露,因为它没有机会被存储到第3步才接管它的shared_ptr对象中去。如果使用make_shared()工厂方法来创建shared_ptr对象,就不会有潜在的资源泄露风险了:

processWidget(make_shared<Widget>(), computePriority());

使用make_unique和make_shared让unique_ptr和shared_ptr在创建对象时就同时获取了资源,即获取资源即初始化(符合了RAII惯例的字面意思)。

3、创建时优化内存空间布局
工厂方法make_shared()在创建shared_ptr对象时,还可以对内存布局进行优化。shared_ptr对象包含了两个指针成员,一个指向资源对象,一个指向控制块,需要进行两次new操作才能初始化完,在访问时需要分别进行两次指针解引用。如果资源对象和控制块分配在同一个内存块中,这样就有更好的空间局部性,对cache更友好。在make_shared()内部可以进行控制这个实现过程,把控制块的大小与资源的大小的和作为分配内存空间的大小,new一次就行了,然后分别让资源对象指针和控制块指针分别指向它们所在的位置,并初始化。让内存空间更紧凑,节省了内存空间,同时因为有更好的cache局部性,也提高了访问速度。

4、保证安全创建智能指针对象
weak_ptr类的lock()成员函数也是创建shared_ptr对象的一个工厂方法,控制的是从一个还没有销毁资源对象的shared_ptr对象中创建另一个shared_ptr对象。在多线程环境下,增加shared_ptr对象的引用计数和把控制块指针、资源对象指针作为参数创建shared_ptr对象时,它们不是原子操作,在多线程下会存在data race。因此,在创建时需要保证线程安全,显然交给程序员在外面实现是不现实的,那就把它封装在一个工厂方法中,让它来控制shared_ptr的创建过程,保证创建过程的线程安全。

enable_shared_from_this<T>类的成员函数shared_from_this()也是创建shared_ptr对象的一个工厂方法,控制的是通过资源对象的this指针来创建shared_ptr对象。它保证了是从一个已有的shared_ptr对象中创建的,如果不是,则会抛出异常;同时也保证了不会发生同一个this指针被多个不同shared_ptr对象管理生存期的错误,否则,如果用户在外部随便把this指针作为参数去调用shared_ptr构造函数,可能是重复管理,而发生错误。

最后,智能指针是裸指针的包装类,而裸指针又指向资源对象,控制创建智能指针对象的过程,实际上也是在控制创建资源对象的过程。例如,工厂模式在控制智能指针对象的创建过程同时,也控制了资源对象使用new在堆上创建,如make_unique()和make_shared(),也控制了shared_ptr对象从this指针创建的过程,如shared_from_this()。

工厂模式控制了智能指针和资源对象的创建过程,那么销毁工作又是如何实现的呢?下一篇文章继续介绍。

http://www.dtcms.com/wzjs/514167.html

相关文章:

  • 宿州网站建设零聚思放心百度快照是什么意思
  • 怎么做网页 网站制作百度账号登录个人中心
  • 无锡网站建设哪里好重庆网站seo多少钱
  • 密山网站建设金昌网站seo
  • 法院网站管理系统源码seo怎样
  • 想创建一个网站企业网络推广方法
  • 怎么样让网站做的大气如何拥有自己的网站
  • app外包网免费seo营销软件
  • 公司网站建设推进表网站建设的数字化和互联网化
  • 公司logo设计理念说明做网站怎么优化
  • 合作客户北京网站建设网络推广文案策划
  • 哪些网站做代理seo网络推广有哪些
  • 做网站学什么软件宁波网站建设网站排名优化
  • 怎么搜索整个网站内容西安百度百科
  • 企业建设门户网站有哪些seo对网站优化
  • 北京建设银行网站10条重大新闻
  • 网站注册备案之后怎么做百度搜索关键词排名靠前
  • dede网站搬家后为什么都没有内容呢站长工具是做什么的
  • 凡客诚品是干嘛的百度关键词优化培训
  • 程序员培训班课程网站优化外包推荐
  • 深圳产品设计手绘天津优化公司哪家好
  • 汽车宣传网站模板定制网站开发公司
  • 湖南微信网站公司简介重庆seo点击工具
  • c2c网站建设2023新闻摘抄十条
  • 商丘做网站公司新站seo快速收录网页内容页的方法疫情防控最新通告
  • 网站的外链接数无锡网站优化公司
  • 做美食网站赚钱吗seo的理解
  • 给别人做网站挣钱吗哈尔滨seo关键词优化
  • 做网站销售的工作电商网站建设方案
  • ps做分享类网站效果图深圳最好seo