c++句柄设计

时间:2021-10-08 20:10:48

  句柄,也称为智能指针。

  我计算了一下我的时间,以后每14天得读完一本书,才不愧对我买的这么多书。然而我还要抽出时间来谢谢博文。最近读的是c++沉思录,开篇就用了3章来讲述句柄。好了,废话少说,接下来谈谈我学到的内容。

  首先,我们知道c语言有指针,高手因为指针而灵活,菜鸟因为指针而危险。c++选择c作为底层语言,并兼容它,必然有指针,我想运用指针的灵活,却不想遇到指针的危险。那我到底用不用指针呢?

  于是,有前人设计了代理类---能指向目标类对象的类,这个代理类只含有一个数据成员--一个指向目标类对象的指针,代理类里定义了一系列的其他操作(函数成员)把这个指针变得不危险。这样一来,就形成了最初步的句柄。

  后来发现,代理类的操作里需要大量的复制操作。所以做了进一步优化,就成了一种句柄类,它能指向目标类对象,含有一个指针,和代理类一样,功能就是当指针用,但没有指针那么危险。它与代理类不同的地方就是,当多个句柄指向(绑定)同一个对象时,它们共享这个目标对象的内存,而代理类是绑定时需要复制。句柄类可以同时绑定统一个对象的内存而不复制,直到某一个句柄要修改它所指向的对象时才复制和修改。这样一来,就减少了很多没有必要的复制操作。带来的技术问题就是需要在目标对象里多加一个数据成员---计数器,用来记录当前指向它的句柄数量,而在最后一个句柄取消与它的绑定时收回这个对象所占用的内存。看,多么智能,这就是它为什么叫智能指针的原因,设计好类和它相应的句柄以后,开发者用起来就得心应手,指针的危险被句柄的设计者解决了,指针的灵活被类的使用者所拥有。

  可是,上面说的这种句柄还有一个缺点,就是它需要在目标对象里增加一个数据成员---计数器,它影响到了目标类,其实目标类只想有句柄用,并不想为此影响到自己的结构,所以有了现在最常用的句柄,把那个计数器从目标类里拿出来,放在任意一个地方,然后在句柄类里增加一个指针成员指向这个计数器,这时候的句柄拥有两个数据成员(一个指向目标对象的指针,一个指向计数器的指针),以后指向同一个目标对象的句柄就都指向同一个计数器,其他细节和上一种句柄类相同。这样一来,句柄就成为了真正的智能指针,指针拥有的危险全部用句柄成员函数把它屏蔽掉,这一部分的设计就看句柄的设计者,他可以把想像出来的优化全部加之进去。

  其实句柄还有很多种类,想法不一样,设计的细节就不一样,功能上也可能会有一些微妙的变化,一切都取决于设计者,但如果你是句柄的设计者,你最好还是把句柄的功能设计的让人用起来感觉和指针一样。如果你把它的功能设计的很怪异,那用这个句柄的人肯定会用不习惯,甚至还会偷偷吐槽设计者。

  c++设计出来的代码,就是优美,只要你住够了解它,它可以描述出你所有能抽象出来的所有东西。

c++句柄设计的更多相关文章

  1. Windows核心编程 第三章 内核对象

    第3章内核对象 在介绍Windows API的时候,首先要讲述内核对象以及它们的句柄.本章将要介绍一些比较抽象的概念,在此并不讨论某个特定内核对象的特性,相反只是介绍适用于所有内核对象的特性. 首先介 ...

  2. Nodejs事件引擎libuv源码剖析之:句柄(handle)结构的设计剖析

    声明:本文为原创博文,转载请注明出处. 句柄(handle)代表一种对持有资源的索引,句柄的叫法在window上较多,在unix/linux等系统上大多称之为描述符,为了抽象不同平台的差异,libuv ...

  3. C++ 句柄类的原理以及设计

    句柄类存在的意义是为了弥补将派生类对象赋给基类对象时发生的切片效应.比如以下的程序: multimap<Base> basket; Base base; Derived derive; b ...

  4. JavaScript权威设计--事件冒泡,捕获,事件句柄,事件源,事件对象&lpar;简要学习笔记十八&rpar;

    1.事件冒泡与事件捕获 2.事件与事件句柄   3.事件委托:利用事件的冒泡技术.子元素的事件最终会冒泡到父元素直到跟节点.事件监听会分析从子元素冒泡上来的事件. 事件委托的好处:     1.每个函 ...

  5. &lbrack;转&rsqb;Android Binder设计与实现 - 设计篇

    摘要 Binder是Android系统进程间通信(IPC)方式之一.Linux已经拥有管道,system V IPC,socket等IPC手段,却还要倚赖Binder来实现进程间通信,说明Binder ...

  6. 以ZeroMQ谈消息中间件的设计【译文】

    本文主要是探究学习比较流行的一款消息层是如何设计与实现的 ØMQ是一种消息传递系统,或者乐意的话可以称它为"面向消息的中间件".它在金融服务,游戏开发,嵌入式系统,学术研究和航空航 ...

  7. SOA 实现:服务设计原则

    http://www.ibm.com/developerworks/cn/webservices/ws-soa-design/ 引言 面向服务的体系结构(Service-Oriented Archit ...

  8. Windows多线程多任务设计初步(转)

    Windows多线程多任务设计初步 [前言:]当前流行的Windows操作系统,它能同时运行几个程序(独立运行的程序又称之为进程),对于同一个程序,它又可以分成若干个独立的执行流,我们称之为线程,线程 ...

  9. 解密jQuery事件核心 - 绑定设计(一)

    说起jQuery的事件,不得不提一下Dean Edwards大神 addEvent库,很多流行的类库的基本思想从他那儿借来的 jQuery的事件处理机制吸取了JavaScript专家Dean Edwa ...

随机推荐

  1. Warning&colon; strftime&lpar;&rpar;&colon; It is not safe to rely on the system&&num;39&semi;s timezone settings&period;

    当运行程序时,会出现如下警告: Warning: strftime(): It is not safe to rely on the system's timezone settings. You a ...

  2. runtime-对成员变量和属性的操作

    成员变量 首先我们来看看成员变量在runtime中是什么样的 在runtime中成员变量是一个objc_ivar类型的结构体,结构体定义如下 struct objc_ivar { char *ivar ...

  3. 基于Spring &plus; Spring MVC &plus; Mybatis 高性能web构建

    基于Spring + Spring MVC + Mybatis 高性能web构建 一直想写这篇文章,前段时间 痴迷于JavaScript.NodeJs.AngularJs,做了大量的研究,对前后端交互 ...

  4. oracle 的 SDO&lowbar;GEOMETRY

    元数据定义 CREATE OR REPLACE TYPE MDSYS.SDO_GEOMETRY AS OBJECT ( SDO_GTYPE NUMBER, SDO_SRID NUMBER, SDO_P ...

  5. 【总算解决了】A network-related or instance-specific error occurred while establishing a connection to SQL Server

    给别人做的网站莫名其妙连接不上数据库.百度了好多,总算知道自己的错在哪了. 报 "A network-related or instance-specific error occurred  ...

  6. 学习h264 的语法规则,如何才能看懂H264 的官方文档

    1. 今天想查h264 的帧率,查找资料如下: 首先要解析sps,得到两个关键的数值: num_units_in_tick, time_scale fps=time_scale/num_units_i ...

  7. sass那些事儿

    Sass,Syntactically Awesome StyleSheets,语法样式表.Sass有两种实现,ruby-sass与lib-sass,前者用ruby实现,后者用C/C++实现. 一.Sa ...

  8. re随机模块应用-生成验证码(无图片)

    方法一,通过choice方式生成验证码 此方法生成每次调用crate_code()会生成三个随机数,然后再三个随机数中选择一个,资源调用相对多些 import random def v_code(co ...

  9. 【Objective-C】Http常用API、同步请求与异步请求&lbrack;转&rsqb;

    比较实用, 转载保存 开发iOS应用要调用Http接口.获取Http资源,有一套比较成熟的框架ASIHTTPRequest.而我还是比较喜欢使用原始一点的API,而它跟其他的面向对象语言有许多共通之处 ...

  10. elasticsearch5使用snapshot接口备份索引

    数据备份是一个必须要考虑的问题,官网提供了 snapshot 接口来备份和恢复数据. 先来看看官方说明: 如果ES是集群,那么需要使用共享存储,支持的存储有: a.shared file system ...