选择特殊符号
选择搜索类型
请输入搜索
为什么要选择为每一个接口单独维护一个引用计数而不是针对整个组件维护引用计数呢?
主要有两个原因:一是使程序调试更为方便;另外一个原因是支持资源的按需获取。
1程序调试:
假设在程序中忘记对某个接口调用Release(其实很多人会犯这个错)。这样组件将永远不会被删除掉,因为只是在引用计数值0时delete才会被调用 。这时就需要找出接口在何时何处应该被释放掉。当然找起来是相当困难的。在只对整个组件维护一个接口的情况下,进行这种 查找更为因难了。此时必须检查使用了此组件所提供的所有接口的代码。但若组件支持对每个接口分别维护一个引用计数那么可以把查找的范围限制在某个特定的接口上。在某些情况下这可以节省大量时间。
2.资源的按需获取
在实现某个接口时可能需要大量的内存或其他资源。对于此种情况,可以在QueryInterface的实现中,在客户请求此接口时完成资源的分配。但若只对整个组件维护一个引用计数,组件将无法决定何时可以安全地将此些接口相关联的内存释放。但基对每个接口分别维护一个引用计数,那么决定何时可以将此内存释放将会容易得多。
正确使用引用计数三条简单的规则
1. 在返回之前调用AddRef。对于那些建好些返回接口指针的函数,在返回之前应该相应的指针调用AddRef。这些函数包括QueryInterface 及CreateInstance。这样当客户从这种 函数得到一个接口后。它将无需调用AddRef.
2.使用完接口之后调用Release。在使用某个接口之后应该调用些接口的Release函数。
3.在赋值之后调用AddRef. 在将一个接口指针赋给另一个接口指针时,应调用AddRef。换句话说,在建立接口的别外一个引用之后应增加相应组件的引用计数。
在客户看来,引用计数是处于接口级的而不是组件级的。但从实现的角度来看,谁的引用计数被记录下来实际上没有关系。客户可以一直接相信组件将记录每个接口本身维护引用计数值。但客户不能假设整个组件维护单个的引用计数。
对于客户而言,每一个接口被分别维护一个引用计数意味着客户应该对它将要使用的指针调用AddRef,而不是其他的什么指针。对于使用完了指针客户应该调用其Release。
选择为每一个接口单独维护一个引用计数而不是针对整个组件维护引用计数的原因:
使程序调试更为方便;支持资源的按需获取;
可以通过增大和减少某个数的值而实现之。
另外要注意的是AddRef和Release的返回值没有什么意义,只是在程序调试中才可能会用得上.客户不应将此从此值当成是组件或其接口的精确引用数。
客户必须对每一个接口具有一个单独的引用计数值那样来处理各接口。因此,客户必须对不同的接口分别进行引用计数,即使它们的生命期是嵌套的。
一、输出参数规则
输出参数指的是给函数的调用者传回一个值的函数参数。从这一点上讲,输出参数的作用同函数的返回值是类似的。任何在输出参数中或作为返回值返回一个新的接口指针的函数必须对些接口指针调用AddRer。
二、输入参数规则
对传入函数的接口指针,无需调用AddRef和Release,这是因为函数的生命期嵌套在调用者的生命期内。
三、输入-输出参数规则
输入-输出参数同时具有输入参数及输出参数的功能。在函数休中可以使用输入-输出参数的值,然后可以对这些值进行修改并将其返回给调用者。
在函数中,对于用输入-输出参数传递进来的接口指针,必须在给它赋另外一个接口指针值之前调用其Release。在函数返回之前,还必须对输出参数中所保存的接口指针调用AddRef。
四、局部变量规则
对于局部自制的接口指针,由于它们只是在函数的生命其内才存在,因此无需调用AddRef和Release。这条规则实际是输入参数规则的直接结果。在下面的例子中,pIX2只是在函数foo的生命期内都在,因此可以保证其生命期将嵌套在所传入的pIX指针的生命期,因此无需对pIX2调用AddRef和Release。
五、全局变量规则
对于保存在全局变量中的接口指针,在将其传递给另外一个函数之前,必须调用其AddRef。由于此变量是全局性的,因此任何函数都可以通过调用其Release来终止其生命期。对于保存在成员变量中的接口指针,也应按此种方式进行处理。因为类中的任何成员函数都可以改变此种接口指针的状态。
六、不能确定时的规则
对于任何不定的情形,都应调用AddRef和Release对。
另外,在决定要进行优化时,应给那些没有进行引用计数的指针加上相应的注释,否则其它程序员在修改代码时,将可能会增大接口指针的生命期,从而合引用计数的优化遭到破坏。
忘记调用Release造成的错误可能比不调用AddRef造成的错误更难检测。
最直观的垃圾收集策略是引用计数。引用计数很简单,但是需要编译器的重要配合,并且增加了赋值函数 (mutator) 的开销(这个术语是针对用户程序的,是从垃圾收集器的角度来看的)。每一个对象都有一个关联的引用计数 —— 对该对象的活跃引用的数量。如果对象的引用计数是零,那么它就是垃圾(用户程序不可到达它),并可以回收。每次修改指针引用时(比如通过赋值语句),或者当引用超出范围时,编译器必须生成代码以更新引用的对象的引用计数。如果对象的引用计数变为零,那么运行时就可以立即收回这个块(并且减少被回收的块所引用的所有块的引用计数),或者将它放到迟延收集队列中。
com组件将维护一个称作是引用计数的数值。当客户从组件取得一个接口时,此引用计数值将增1。当客户使用完某个接口后,组件的引用计数值将减1.当引用计数值为0时,组件即可将自己从内存中删除。
与跟踪式垃圾回收相比,引用计数的主要优点是可以尽快地回收不再被使用的对象,同时在回收过程中不会导致长时间的停顿,还可以清晰地标明每一个对象的生存周期。
在实时应用或内存受限的系统中,实时响应能力是一项重要指标,而引用计数作为最容易实现的垃圾回收技术之一,很适合于这种情况。引用计数还可以用于管理其他非内存资源,如操作系统对象(经常比内存资源更稀缺)。跟踪式垃圾回收技术用终结器处理此类目标,但延迟回收可能引发其他问题。加权引用计数是适用于分布式系统的派生技术。
在可用内存被活跃对象填满的平台上,跟踪式垃圾回收会被频繁触发,从而降低性能。而引用计数即便在内存濒临耗尽的情况下性能依然有所保障。引用计数还能为其他运行时优化技术提供参考信息,例如对于许多使用不可变对象的系统来说(如函数式编程语言),大量复制对象导致的性能惩罚有时十分严重;在此类系统上一个典型的优化措施是:假如一个对象被创建以后仅使用了一次,且在其不再被引用的同时另一个类似的对象被创建出来(如Javascript中的字符串拼接赋值操作),可以将删除原对象创建新对象的行为变为修改原对象,从而提高效率。引用计数可以为这类优化提供充分的参考信息。
未经优化的引用计数相比跟踪式垃圾回收有两个主要缺点,都需要引入附加机制予以修复:
频繁更新引用计数会降低运行效率。
原始的引用计数无法解决循环引用问题。
另外,如果使用空闲列表分配内存,那么引用计数的空间局域性非常差。仅使用引用计数无法通过移动对象来提高CPU缓存的性能,所以高性能的内存分配器都会同时实现一个跟踪式垃圾回收器以提高性能。许多引用计数实现(比如PHP和Objective-C)的性能不佳都是因为没有实现内存拷贝。
先称一个产品的个数重量,然后再输入取样产品的重量,再放上其他的产品,再按点数功能键。就可称出其他产品的个数
计数秤使用步骤:开机回零,按设定或计数键进入计数程序,(数一定数量产品,如五或十)放在秤上再按设定或计数键进入计数…(计数显示最大量因秤而定)再按设定或计数键退出计数系统。
水泥计数器就是:水泥厂装车机上用的,专门用于水泥袋出库装车时,自动计数和点包的自动控制微机。 HQ-210水泥计数器(又名:HQ-210水泥点包机) 应用领域: 水泥厂、化肥厂、面粉厂、饲料厂、化...
注塑模中使用计数器实现可转动螺纹型芯的角度定位
针对注塑模中需要对可自动脱螺纹的螺纹型芯起始角度作出规定的情况,采用计数器作为主要的机电部件,光电传感器和光电反射板作为辅助部件,通过计数器的计数电路接入注塑机的液压马达控制电路,以有外形角度对应特征的瓶和瓶盖注塑零件为例,在注塑模上使用计数器完成了可转动螺纹型芯的角度定位。这种方法稳定可靠,在螺纹型芯起始角度定位有一定公差的情况下,可以使用该套模具。
用计数法测量玻璃纤维滤纸穿透率的研究
介绍玻璃纤维滤纸的发展情况和欧洲标准EN1822所推荐的高效滤纸过滤性能测试系统,通过理论推导与实验对比,分析此测试系统中光学粒子计数器的重叠损失和系统中测试气溶胶浓度波动引起的测量误差。结果表明,当高效滤纸效率测试系统选用2台计数器时,测试结果受气溶胶浓度波动影响很小,仅取决于计数器自身的重叠误差;当选用1台计数器分别上、下游采样时,存在着由于气溶胶粒子浓度波动所造成的测试误差,可通过减少气溶胶发尘器发尘浓度的波动来有效地减小这种误差。
μC/TCP-IP在运行过程中维护着一组计数器,用于追踪网络协议栈的各种错误态。如果需要的话,应用程序可以通过检查错误计数器来调试运行当中的问题,包括内存剩余空间较低、性能差或数据包丢失等等。
网络协议的错误计数器被放在一个命名为Net_ ErrCtrs的结构体变量中,可以利用调试器或应用程序(以外部变量的形式引用)在运行时检测该变量。
要使能这些错误统计,必须将net_cfg.h中的 NET_CTR_CFG_ERR_EN配置为DEF_ENABLED。
具有记忆输入脉冲个数作用的逻辑部件,称之为计数器。计数器的种类很多,按进位制可分为二进制、十进制、五进制、七进制等计数器;按计数器中触发器翻转的次序可分为异步式和同步式两种;按计数过程中数字的增、减可分为加法、减法、加减可逆计数器等。
在数字系统中,对脉冲的个数进行计数、以实现数字测量、运算和控制的数字部件,称为计数器。
计数器主要由触发器构成。若按触发器的翻转的次序来分类,可以把计数器分为同步式和异步式。在同步计数器中,当计数脉冲输入时所有触发器是同时翻转的;而在异步计数器中,各级触发器则不是同时翻转的。若按计数过程中计数器中数字的增减来分类,可以分为加法计数器,减法计数器和可逆计数器(亦称加减计数器)。加法计数器是随着计数脉冲的不断输入而递增计数的;减法计数器是随着计数脉冲的不断输入而递减计数的;可增可减的称可逆计数器 。
计数器是一种逻辑元件,在一事件发出时,可使所存储数据增加“1”或一个常数。从某种意义上说,计数器也是一个寄存器,它能“记住”送到其输入端的脉冲数目。计数器对计算机来说是很重要的,例如在控制器中要对程序中的指令地址进行计数,以便在执行完一条指令后,按新的地址转入下一条指令。计数器由一定数量的触发器和门电路组成,现在一般都采用集成电路 。
1、如果按照计数器中的触发器是否同时翻转分类,可将计数器分为同步计数器和异步计数器两种。
2、如果按照计数过程中数字增减分类,又可将计数器分为加法计数器、减法计数器和可逆计数器,随时钟信号不断增加的为加法计数器,不断减少的为减法计数器,可增可减的叫做可逆计数器。