c++句柄设计
句柄,也称为智能指针。
我计算了一下我的时间,以后每14天得读完一本书,才不愧对我买的这么多书。然而我还要抽出时间来谢谢博文。最近读的是c++沉思录,开篇就用了3章来讲述句柄。好了,废话少说,接下来谈谈我学到的内容。
首先,我们知道c语言有指针,高手因为指针而灵活,菜鸟因为指针而危险。c++选择c作为底层语言,并兼容它,必然有指针,我想运用指针的灵活,却不想遇到指针的危险。那我到底用不用指针呢?
于是,有前人设计了代理类---能指向目标类对象的类,这个代理类只含有一个数据成员--一个指向目标类对象的指针,代理类里定义了一系列的其他操作(函数成员)把这个指针变得不危险。这样一来,就形成了最初步的句柄。
后来发现,代理类的操作里需要大量的复制操作。所以做了进一步优化,就成了一种句柄类,它能指向目标类对象,含有一个指针,和代理类一样,功能就是当指针用,但没有指针那么危险。它与代理类不同的地方就是,当多个句柄指向(绑定)同一个对象时,它们共享这个目标对象的内存,而代理类是绑定时需要复制。句柄类可以同时绑定统一个对象的内存而不复制,直到某一个句柄要修改它所指向的对象时才复制和修改。这样一来,就减少了很多没有必要的复制操作。带来的技术问题就是需要在目标对象里多加一个数据成员---计数器,用来记录当前指向它的句柄数量,而在最后一个句柄取消与它的绑定时收回这个对象所占用的内存。看,多么智能,这就是它为什么叫智能指针的原因,设计好类和它相应的句柄以后,开发者用起来就得心应手,指针的危险被句柄的设计者解决了,指针的灵活被类的使用者所拥有。
可是,上面说的这种句柄还有一个缺点,就是它需要在目标对象里增加一个数据成员---计数器,它影响到了目标类,其实目标类只想有句柄用,并不想为此影响到自己的结构,所以有了现在最常用的句柄,把那个计数器从目标类里拿出来,放在任意一个地方,然后在句柄类里增加一个指针成员指向这个计数器,这时候的句柄拥有两个数据成员(一个指向目标对象的指针,一个指向计数器的指针),以后指向同一个目标对象的句柄就都指向同一个计数器,其他细节和上一种句柄类相同。这样一来,句柄就成为了真正的智能指针,指针拥有的危险全部用句柄成员函数把它屏蔽掉,这一部分的设计就看句柄的设计者,他可以把想像出来的优化全部加之进去。
其实句柄还有很多种类,想法不一样,设计的细节就不一样,功能上也可能会有一些微妙的变化,一切都取决于设计者,但如果你是句柄的设计者,你最好还是把句柄的功能设计的让人用起来感觉和指针一样。如果你把它的功能设计的很怪异,那用这个句柄的人肯定会用不习惯,甚至还会偷偷吐槽设计者。
c++设计出来的代码,就是优美,只要你住够了解它,它可以描述出你所有能抽象出来的所有东西。
c++句柄设计的更多相关文章
- Windows核心编程 第三章 内核对象
第3章内核对象 在介绍Windows API的时候,首先要讲述内核对象以及它们的句柄.本章将要介绍一些比较抽象的概念,在此并不讨论某个特定内核对象的特性,相反只是介绍适用于所有内核对象的特性. 首先介 ...
- Nodejs事件引擎libuv源码剖析之:句柄(handle)结构的设计剖析
声明:本文为原创博文,转载请注明出处. 句柄(handle)代表一种对持有资源的索引,句柄的叫法在window上较多,在unix/linux等系统上大多称之为描述符,为了抽象不同平台的差异,libuv ...
- C++ 句柄类的原理以及设计
句柄类存在的意义是为了弥补将派生类对象赋给基类对象时发生的切片效应.比如以下的程序: multimap<Base> basket; Base base; Derived derive; b ...
- JavaScript权威设计--事件冒泡,捕获,事件句柄,事件源,事件对象(简要学习笔记十八)
1.事件冒泡与事件捕获 2.事件与事件句柄 3.事件委托:利用事件的冒泡技术.子元素的事件最终会冒泡到父元素直到跟节点.事件监听会分析从子元素冒泡上来的事件. 事件委托的好处: 1.每个函 ...
- [转]Android Binder设计与实现 - 设计篇
摘要 Binder是Android系统进程间通信(IPC)方式之一.Linux已经拥有管道,system V IPC,socket等IPC手段,却还要倚赖Binder来实现进程间通信,说明Binder ...
- 以ZeroMQ谈消息中间件的设计【译文】
本文主要是探究学习比较流行的一款消息层是如何设计与实现的 ØMQ是一种消息传递系统,或者乐意的话可以称它为"面向消息的中间件".它在金融服务,游戏开发,嵌入式系统,学术研究和航空航 ...
- SOA 实现:服务设计原则
http://www.ibm.com/developerworks/cn/webservices/ws-soa-design/ 引言 面向服务的体系结构(Service-Oriented Archit ...
- Windows多线程多任务设计初步(转)
Windows多线程多任务设计初步 [前言:]当前流行的Windows操作系统,它能同时运行几个程序(独立运行的程序又称之为进程),对于同一个程序,它又可以分成若干个独立的执行流,我们称之为线程,线程 ...
- 解密jQuery事件核心 - 绑定设计(一)
说起jQuery的事件,不得不提一下Dean Edwards大神 addEvent库,很多流行的类库的基本思想从他那儿借来的 jQuery的事件处理机制吸取了JavaScript专家Dean Edwa ...
随机推荐
- 对ToString("X2 ")的理解
/// <summary> /// 将byte型转换为字符串 /// </summary> /// <param name=&q ...
- 界面绚丽的SharePoint仪表盘控件Nevron Gauge for SharePoint 控件详细介绍
Nevron .NET Vision 是一款用于创建独特的.强大的数据表示应用程序的最终控件,它具有超强的数据可视化性能. 整合了Nevron Chart for .NET, Nevron Diagr ...
- sqlite的ef使用小结
最近有一个小项目,老师推荐我用下sqlite这种轻型的数据库来进行数据的存储.轻型数据库具有其独特之处:方便,不用安装特定的软件就能够实用,关于sqlite的优点我不赘述,网上还是有好多资料的. 但我 ...
- JDBC操作步骤及数据库连接操作
http://blog.csdn.net/joywy/article/details/7731305
- 浅谈大数据神器Spark中的RDD
1.究竟什么是RDD呢? 有人可能会回答是:Resilient Distributed Dataset.没错,的确是如此.但是我们问这个实际上是想知道RDD到底是个什么东西?以及它到底能干嘛?好的,有 ...
- Xcode清除缓存、清理多余证书
Xcode清除缓存.清理多余证书 1.删除Xcode中多余的证书provisioning profile 手动删除: Xcode6 provisioning profile path: ~/Libra ...
- 北大poj-1005
I Think I Need a Houseboat Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 99271 Acce ...
- 基于.NET的CAD二次开发学习笔记二:AutoCAD .NET中的对象
1.CAD对象:一个CAD文件(DWG文件)即对应一个数据库,数据库中的所有组成部分,看的见(包括点.多段线.文字.圆等)和看不见(图层.线型.颜色等)的都是对象,数据库本身也是一个对象. 直线.圆弧 ...
- The constructor User.Student(String, String, String) is not visible
项目:蒙文词语检索 日期:2016-05-01 提示:The constructor User.Student(String, String, String) is not visible 出处:Db ...
- 关于AE
1.下方时间轴左边上角时间,按住ctrl点击,可切换时间与帧数 2.新建comp,ctrl+n 3.特效控制面板,F3 4.时间轴左边图层各个属性快捷键:移动,p:旋转,r:缩放,s:轴心,a:不透明 ...