当前位置:七道奇文章资讯编程技术VC/C++编程
日期:2011-03-22 13:56:00  来源:本站整理

<b>C++引用计数的智能指针有效回收办法</b>[VC/C++编程]

赞助商链接



  本文“<b>C++引用计数的智能指针有效回收办法</b>[VC/C++编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:

引用计数指针能否能有效地回收,对系统不测关机之后数据的恢复来说至关重要,关键是要避免对象复制.

怎样从灾难性弊端中,恢复一个长期运行、系统级的后台保护进程大概服务,在目前的软件计划历程中,已成为了一个重要的考虑因素.当这些软件是由C++语言编成,并利用了引用计数的智能指针时,那么,智能指针的有效回收,对系统能否具有可伸缩级的恢复本领、乃至精确地持续未完成的操作来说,都显得至关重要.

在本文中,描写了一种办法,可从关机之后的软件恢复中,有效地回收引用计数指针,并且此办法在内存占用方面也非常高效,这种办法的关键在于避免对象复制,而对象复制普通是由C++中指针引用的串行化与反串行化这种传统技术产生的.当从存档文件中反串行化时,本办法利用了标志(tag)来唯一地辨认指针对象,且在系统恢复时由一个对象缓存来保存指针引用.

本文以一个基于事件的商业及时功课调度系统来举行演示,其普通由大型市场咨询公司利用,每天城市在集群工作站上处理不可胜数的计算任务.

为什么很多C++软件项目会利用自动内存管理技术呢,因为它有以下好处:

² 代码安全性.避免了太早释放一个对象所带来的风险.

² 代码精确性.避免了忘掉释放未利用内存所带来的风险.

² 代码模块性.代码中不再需求点缀着与程序无关的簿记代码.

² 编程简单性.目前可假定一种无限内存的计算情势.

² 编程高效性.程序员不再耽忧内存管理问题.

引用计数智能指针,有时也称为“计数体术语”,是一种生命期受管的对象,其对引用它的数目,有一个内部的计数器.当内部引用计数为零时,这些对象会自动销毁自身,这是一种非常有效的技术,已应用在很多C++软件产品项目中,因为简单易行,且无需对语言或编译器举行任何扩大.

引用计数智能指针能进一步定义为一体式或别离式,一体式智能指针把引用计数放在自身内,而别离式智能指针则把引用计数放在对象之外.在本文中,利用的是别离式智能指针筹划,这需求在拜候实际对象指针之前,在智能指针模板对象中重载 -> 或 * 操作符,从本质上来说,这也是代理(Proxy)计划情势的一个特例.

就目前来说,还没有一种筹划以高效操纵内存的方法描写了怎样恢复智能指针,而传统的C++对象串行与反串行化办法,会招致内存低效,因为当一个反串行化的对象碰到一个对它的引用时,老是会成立一个新对象,在最坏的情形下,这会把一个恢复后的保护进程的内存损耗量,推到一个无法承受的高度,导致它无法持续运行下去.

问题的引出

传统对象的串行与反串行化筹划,也能实现智能指针,只不过在内存上对比低效罢了.在这些传统筹划中,当一个对象串行化时,对象内的成员指针被解引用,它的内容与对象一同“串行”进存档文件中.这种办法的问题在于,当反串行化时,成员指针会再次构造,且是每个恢复的对象城市这样.

下面以基于事件的功课调度系统来举行讲授,功课定义在CJobDef对象中,其包含了功课的静态属性,如它履行的号令、工作目录、及功课履行时的用户ID.而功课定义的运行实例则包装在CJobInst对象中,其包含了一些与实例有关的属性,如它的进程ID、履行参数、及运行历史记录.在类层次上,每个CJobInst对象都包含了一个成员,其引用到触发这次功课实例的原始CJobDef对象.

图1是软件终止运行之前的系统,运行时CJobInst对象的多个实例大概会引用至同一个CJobDef对象.在软件终止及恢复后,传统串行化对象恢复办法,会招致为每个运行的CJobInst对象,都成立一个CJobDef对象,如图2中所示.

图1:恢复之前的对象图

图2:内存低效恢复之后的对象图

这种情形发生在传统的C++类对象中指针成员串行化与反串行化时,例1,是一段带有重载>>与<<操作符,串行及反串行化CJobInst与CJobDef类指针的CArchive类代码,也证明了这点.

例1:

以下是引用片段:
classCJobDef
   {
   friendCArchive&operator>>(CArchive&ar,CJobDef*def)
   {
   ar>>def->command;
   }
   friendCArchive&operator<<(CArchive&ar,CjobDef*def)
   {
   ar<<def->command;
   }
   private:
   std::stringcommand;
   };
   classCJobInst
   {
   friendCArchive&operator>>(CArchive&ar,CJobInst*inst)
   {
   inst->m_def=newCJobDef;
   ar>>inst->m_def;
   }
   friendCArchive&operator<<(CArchive&ar,constCJobInst*inst)
   {
   ar<<inst->m_def;
   }
   private:
   CJobDef*m_def;
   };

在CJobInst中串行化CJobDef的私有成员m_def触及到调用CArchive类中得当的<<操作符,重载的<<操作符通过把对象属性串行化进一个永久的存档文件,来实现对CJobDef指针的串行化;反串行化CJobDef指针触及到构造一个新的对象,并调用>>操作符从存档文件中更新属性.
  以上是“<b>C++引用计数的智能指针有效回收办法</b>[VC/C++编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:

  • <b>hosts是什么 hosts文件在什么位置 若何改正hosts</b>
  • <b>在 Windows 8 中手动安装语言包</b>
  • <b>五个常见 PHP数据库问题</b>
  • Windows中Alt键的12个高效快速的利用本领介绍
  • <b>MySQL ORDER BY 的实现解析</b>
  • <b>详解MySQL存储历程参数有三种范例(in、out、inout)</b>
  • <b>Win8系统恢复出来经典的开始菜单的办法</b>
  • <b>Win8系统花屏怎么办 Win8系统花屏的办理办法</b>
  • <b>Windows 7系统下无线网卡安装</b>
  • <b>为什么 Linux不需求碎片整理</b>
  • <b>Windows 8中删除账户的几种办法(图)</b>
  • <b>教你如安在win7下配置路由器</b>
  • 本文地址: 与您的QQ/BBS好友分享!
    • 好的评价 如果您觉得此文章好,就请您
        0%(0)
    • 差的评价 如果您觉得此文章差,就请您
        0%(0)

    文章评论评论内容只代表网友观点,与本站立场无关!

       评论摘要(共 0 条,得分 0 分,平均 0 分) 查看完整评论
    Copyright © 2020-2022 www.xiamiku.com. All Rights Reserved .