WEB开发网
开发学院软件开发Delphi 浅谈引用计数 阅读

浅谈引用计数

 2006-02-04 13:41:39 来源:WEB开发网   
核心提示:浅谈引用计数前言作为Delphi程序员,您可以不用看这节内容,浅谈引用计数,但是如果您想更多的了解一些COM内部技术,或是在对象模型与引用模型之间可以进行很好的控制的话,而此时我们选择不同的方式就有可能需要自己增加引用计数变量进行控制了,如:var oFRefCount : Integer;//对象一级的引用计数的

浅谈引用计数

前言 作为Delphi程序员,您可以不用看这节内容,但是如果您想更多的了解一些COM内部技术,或是在对象模型与引用模型之间可以进行很好的控制的话,笔者更希望你可以抽出些许时间来看这一切的内容,而益处提体的将很明显,您可以自由的用一些技巧来解决让您头疼的问题。好了,继续我们今天的交流; 在组件技术必备知识二中,我们对接口(Interface)进行了一些介绍,当我们并没有深入的对接口的实现/效率/优化等问题进行进一步的禅述,而了解它们的确对于我们以后的编程是有很大的帮助的,我们都知道,每个接口都会维护一个全局变量FRefCount (这是Object Pascal里的变量名称,如果是在C++里,它维护的是m_CRef),它专门用来控制接口的生命周期,或是组件的生命周期(组件/接口同样具有生命周期),当然,我们也可以给接口强制给值Nil同样可以释放接口,但那是不安全的或是不应该被推荐的。在此处之所以将引用技术做为一个课题例出来就是希望各位可以对组件的优化、效率方面认识一些。而FRefCount是在_AddRef and _Release中得以实现的,如下代码(本节所有代码摘自Delphi6中,只要您的参考版本是Delphi4以上,代码都是相同的)。 function TInterfacedObject._AddRef: Integer; begin   Result := InterlockedIncrement(FRefCount); end;   function TInterfacedObject._Release: Integer; begin   Result := InterlockedDecrement(FRefCount);   if Result = 0 then    Destroy; end; 从代码中我们可以看出,接口的生命周期是在_AddRef and _Release两个方法中控制的,事实上,这两个方面在组件编程中,就是专门用来控制组件的生命周期(关于组件生命周期和接口生命周期我们将会近一步的进行说明。),之外它们可以说是没有意义的,而引用计数变量(FRefCount)如果在不考虑组件的生命周期时,也是完全没有意义的。 AddRef and Release是实现的一种名为引用计数的内存管理技术,引用计数技术是使组件自己删除组件的最简单的同时也是效率最高的方法。COM组件将维护一个引用计数的变量来对自己生命周期进行管理,当客户从组件获得一个接口时,这个引用计数变量会进行增1操作(_AddRef),当客户释放了对接口的调用时,组件会自动的进行引用计数的减1操作(_Release),在基于Delphi的编程中,我们可以不去考虑什么时候进行调用这两个方法,但是如果您一旦脱离了Delphi的话,您可能必须要考虑什么时候调用这两个方法,如在C++中,您就一定要自己调用这两个方法,这也正是笔者为什么会写这一节的内容.简单的来说,引用计数我们平时不需要去考虑,但是在对象引用和接口引用中,您就需要自己去调用这两个方法,同时它还涉及到作为一个组件是去整个的释放还是单个的释放上以及最小单位的释放上是有必要去考虑引用计数的。如:对于一个COM组件而言,它封装了一些COM对象,但是用户通过接口可能需要调用COM组件中的几个COM对象提供的服务,那么问题就产生了,用户有可能在访问完了一个COM对象再去访问另一个COM对象或是进行互动的方式进行访问,很不幸运的是这个组件又是一个占用内存资用很大的组件,特别提体到用户所访问的两个或是更多的COM对象的同时,您如何对组件进行有效的管理呢?是用户访问完了一个COM对象之后就立马释放这个COM对象呢?还是当用户对组件访问完成之后再进行组件级的释放呢?或是您更详细的对每一个用户已经不用的接口进行释放呢?这都对组件的效率有些许影响。而此时我们选择不同的方式就有可能需要自己增加引用计数变量进行控制了,如: var   oFRefCount : Integer;//对象一级的引用计数的应用 begin   ……. end;    var   cFRefCount : Integer;//组件一级的引用计数的应用。 begin   …… end; 或是直接引用FRefCount//接口一级的应用计数的应用。

Tags:引用 计数

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接