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

理解C++非常处理的系统开支[VC/C++编程]

赞助商链接



  本文“理解C++非常处理的系统开支[VC/C++编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:

为了在运行时处理非常,程序要记录大量的信息.无论履行到什么地方,程序都必须可以辨认出假如在此处抛出非常的话,将要被释放哪一个对象;程序必须知道每一个进口点,以便从try块中退出;关于每一个try块,他们都必须跟踪与其相关的catch子句以及这些catch子句可以捕捉的非常范例.这种信息的记录不是没有代价的.确保程序满意异通例格不需求运行时的对比(runtime comparisons),并且当非常被抛出时也不用额外的开销来释放相关的对象和匹配精确的catch字句.但是非常处理确是有代价的,即便你没有利用try,throw或catch关键字,你一样得付出一些代价.

让我们先从你不利用任何非常处理特点也要付出的代价谈起.你需求空间成立数据构造来跟踪对象能否被完好构造(constructed)(参与条款10),你也需求系统时间保持这些数据构造不断更新.这些开销普通不是很大,但是当采取不支持非常的办法编译的程序普通比支持非常的程序运行速度更快所占空间也更小.

在理论上,你不能对此举行挑选:C++编译器必须支持非常,也就是说,当你不用非常处理时你不能让编译器生产商消除这方面的开销,因为程序普通由多个独立生成的目标文件(object files)构成,只有一个目标文件不举行非常处理并不能代表其他目标文件不举行非常处理.并且即便构成可履行文件的目标文件都不举行非常处理,那么还有它们所衔接的程序库呢?假如程序的任何部份利用了非常,别的部份必须也支持非常.不然在运行时程序就不大概供应精确的非常处理.

不过这只是理论,实际上大部份支持非常的编译器生产商都答应你安闲掌握能否在生成的代码里包含进支持非常的内容.假如你知道你程序的任何部份都不利用try,throw或catch,并且你也知道所衔接的程序库也没有利用try,throw或catch,你便可以采取不支持非常处理的办法举行编译,这可以缩小程序的尺寸和提高速度,不然你就得为一个不需求的特点而付出代价.随着时间的推移,利用异处理的程序库开始变得广泛了,上面这种办法将渐渐不能利用,但是按照目前的软件开辟情形来看,假如你已经决意不利用任何的非常特点,那么采取不支持非常的办法编译程序是一本性能优化的公道办法.一样这关于想避开非常的程序库来说也是一本性能优化的好办法,这能保证非常不会从客户端程序传送进程序库里,不过同时这样做也会阻碍客户端程序重定义程序库中声明的虚拟函数,并不答应有在客户端定义的回调函数.

利用非常处理的第二个开销来自于try块,无论什么时刻利用它,也就是无论什么时刻你想可以捕捉非常,那你都得为此付出代价.差别的编译器实现try块的办法差别,所以编译器与编译器间的开销也不一样.大概地预计,假如你利用try块,代码的尺寸将增添5%-10%并且运行速度也同比例减慢.这还是假定程序没有抛出非常,我这里谈论的只是在程序里利用try块的开销.为了削减开销,你应当避免利用无用的try块.

编译器为异通例格生成的代码与它们为try块生成的代码一样多,所以一个异通例格普通花掉与tyr块一样多的系统开销.什么?你说你认为异通例格只是一个规格罢了,你认为它们不会产生代码?那么好,目前你应当对此有新的熟习了.

目前我们来到了问题的核心部份,看看抛出非常的开销.事实上我们不用太关心这个问题,因为非常是很少见的,这种事件的发生常常被描写为exceptional(非常的,罕有的).80-20法则(拜见条款16)奉告我们这样的事件不会对整个程序的性能造成太大的影响.但是我知道你仍旧好奇地想知道假如抛出一个非常到底会有多大的开销,答案是这大概会对比大.与一个正常的函数返回相比,通过抛出非常从函数里返回大概会慢三个数目级.这个开销很大.但是仅仅当你抛出非常时才会有这个开销,普通不会发生.但是假如你用非常表示一个对比广泛的情况,比方完成对数据构造的遍历或完毕一个循环,那你必须重新予以考虑.

不过请等一下,你问我是怎么知道这些事情的呢?假如说支持非常关于大大都编译器来说是一个较新的特点,假如说差别的编译器非常办法也差别,那么我若何能说程序的尺寸将增大5%-10%,它的速度也同比例减慢,并且假若有大量的非常被抛出,程序运行速度会呈数目级的减慢呢?答案是令人惊骇的:一些据说和一些基准测试(benchmarks)(拜见条款23).事实是大部份人包含编译器生产商在非常处理方面几近没有什么经验,所以固然我们知道非常确切会带来开销,却很难猜测出开销的精确数目.

谨严的办法是对本条款所论述的开销有理解,但是不深究具体的数目.(即定性不定量 译者注)不管非常处理的开销有多大我们都得保持只有必须付出时才付出的原则.为了使你的非常开销最小化,只要大概尽大概就采取不支持非常的办法编译程序,把利用try块和异通例格限制在你确切需求它们的地方,并且只有在确为非常的情形下(exceptional)才抛出非常.假如你在性能上仍旧有问题,总体评价一下你的软件以决意非常支持能否是一个起作用的因素.假如是,那就考虑挑选别的的编译器,能在C++非常处理方面具有更高实现效率的编译器.


  以上是“理解C++非常处理的系统开支[VC/C++编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
  • 深化理解Collections API
  • 深化理解Cookie
  • 理解C++非常处理的系统开支
  • <b>深化理解C++中的mutable关键字</b>
  • 理解C++面向对象程序计划中的抽象理论
  • <b>C++:从栈和堆来理解C#中的值范例和引用范例</b>
  • MySQL管理员帮你理解CREATE和REVOKE语句
  • 理解CSS的工作原理
  • <b>通过Dreamweaver学习理解CSS</b>
  • 本文地址: 与您的QQ/BBS好友分享!
    • 好的评价 如果您觉得此文章好,就请您
        0%(0)
    • 差的评价 如果您觉得此文章差,就请您
        0%(0)

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

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