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 ...
随机推荐
- C++ 之 新式转型操作符
四种新式转型: const_cast.dynamic_cast.reinterpret_cast.static_cast!! 1.const_cast : 去除常量性 2.dynamic_cast ...
- js键盘事件
弱鸡今天在写键盘事件,发生一个小bug,排查了1小时(">皿<)可恶的浏览器竟然还不报错!!原因是将e.ctrlKey写成了e.ctrLKey,o(゚Д゚)っ 想想都要生气< ...
- java install
http://www.cnblogs.com/a2211009/p/4265225.html
- Binding ConvererParameter
WPF中ConverterParameter不可以绑定,可以通过如下扩展来实现ConverterParameter的Binding: 1.自定义ConverterBindableBinding和Mul ...
- mstsc连接服务器时如何避免每次在登陆窗口输入密码(rdp passwd decrypted )
http://blog.chinaunix.net/uid-1835840-id-2831518.html 我们经常需要连接很多服务器,或者服务器的ip经常变动.把连接的密码保存在rdp配置文件里,用 ...
- 采用ubuntu系统来安装tensorflow
最近在学习google新开源的深度学习框架tensorflow.发现安装它的时候,需要依赖python2.7.X;我之前一直使用的linux是centos.而centos不更新了,里面的自带的pyth ...
- 【转】深入理解JavaScript闭包闭包(closure) (closure)
一.什么是闭包?"官方"的解释是:闭包是一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分.相信很少有人能直接看懂这句话,因为他描述 ...
- django开发过程中静态文件路径配置
在demo项目的settings.py文件中找到 STATICFILES_DIRS STATICFILES_DIRS = ( 'static', #这个名字是项目根目录下的文件夹名称,注意后面有逗号 ...
- iOS UITableViewCell滑动删除
一般我们使用列表的形式展现数据就会用到UITableView.在熟练掌握了用UITableView展示数据以后,开发过程中可能会遇到需要删除数据的需求,我们想实现在一行数据上划动一下,然后出现一个删除 ...
- 如何启动app时全屏显示Default.png(图片)?