C++异常是C++有别于C的一大特性 ,异常处理机制给开发人员处理程序中可能出现的意外错误带来了极大的方便,但为了实现异常,编译器会引入额外的数据结构与处理机制,增加了系统的开销。天下没有免费的午餐,使用异常时我们必须了解其带来的开销和问题。

C++异常处理使用try、throw和catch三个关键词来完成,在程序执行过程中,异常处理流程大致如下:当函数体内某处发生异常(trow 异常)时,会检查该异常发生的位置是否在当前函数的某个try块之内,如果在的话,那么就需要找出与该try块配套的catch块。如果catch不匹配或者不在当前函数的某个try块的话,则沿着函数调用链逐层向上查找。当回退到上一层函数后,重复前面的操作。为了能够成功地捕获异常和正确地完成栈回退(stack unwind),C++引入了相应的处理机制以及TRYBLOCK、CATCHBLOCK和UNWINDTBL数据结构来保存异常处理。我们首先来看看引入了异常处理机制的栈框架如下图所示:

在每个 C++ 函数的栈框架中都多了一些与异常处理相关的数据,仔细观察的话,多出来的东西正好是一个 EXP 类型的结构体,这是一个典型的单向链表式结构:
(1)piPrev 成员指向链表的上一个节点,它主要用于在函数调用栈中逐级向上寻找匹配的 catch 块,并完成栈回退工作;

(2)piHandler 成员指向完成异常捕获和栈回退所必须的数据结构(主要是两张记载着关键数据的表:try块表tblTryBlocks 及栈回退表tblUnwind);

(3)nStep成员用来定位 try 块,以及在栈回退表中寻找正确的入口。其中EXP类型的结构体是一个单向链表式结构,用于完成异常回溯捕获以及栈回退清理工作。

一般来说,使用异常处理,因为异常处理信息的加入,除了会降低程序执行速度,也会导致编译生成后的程序尺寸偏大。

异常处理除了上面涉及的时间与空间的开销,使用时也会带来如下问题:
(1)项目中使用异常,需要考虑与未使用异常的第三方和旧项目代码的整合问题,避免出现一异常安全问题;
(2)异常使用不当,容易造成内存泄漏和程序崩溃,比如函数内抛出异常需要注意栈展开导致的内存泄露,析构函数抛出异常将程序置于不确定状态等;
(3)异常的跳转会彻底扰乱程序的执行流程并难以判断,给代码调试和维护增加难度;
(4)为保证写出异常安全的代码,往往需要借用C++其它特性,如智能指针,这又进一步加剧了代码可读性的恶化与程序的时空开销,包括编译时间的延长,运行效率的较低以及代码尺寸的增大。

异常处理是 C++ 中十分有用的崭新特性之一,在大多数情况下,有着优异的表现和令人满意的时空效率。但使用异常时,我们要充分意识到异常带来和开销和需要注意的问题,综合考虑之下,再谨慎使用异常。


参考文献

[1]改善C++程序的150个建议[M].李健.建议69:熟悉异常处理的代价
[2]C++异常机制的实现方式和开销分析

C++异常处理的开销相关推荐

  1. VC++,掀起你的盖头来

    VC++,掀起你的盖头来 --谈VC++对象模型 (美)简  格雷 程化    译 译者前言 一个C++程序员,想要进一步提升技术水平的话,应该多了解一些语言的语意细节.对于使用VC++的程序员来说 ...

  2. C++ Under the Hood

    VC++,掀起你的盖头来 --谈VC++对象模型 (美)简  格雷 程化    译 译者前言 一个C++程序员,想要进一步提升技术水平的话,应该多了解一些语言的语意细节.对于使用VC++的程序员来说 ...

  3. 检索方法应该返回#39;null#39;还是无法产生返回值时引发异常? [关闭]

    已关闭 . 这个问题是 基于观点的 . 它当前不接受答案. 想改善这个问题吗? 更新问题,以便通过编辑此帖子以事实和引用的形式回答. 3年前关闭. 我有一种方法,应该在找到对象后返回它. 如果找不到, ...

  4. More effective C++学习总结

    More effective C++摘要 3 基础议题部分: 3.1 M1:指针与引用的区别 首先,要认识到在任何情况下都不能使用指向空值的引用,引用必须被初始化.一个引用必须总是指向某些对象. (不 ...

  5. 【转】SQL语言艺术

    SQL 语言艺术 内容介绍 本书分为12章,每一章包含许多原则或准则,并通过举例的方式对原则进行解释说明.这些例 子大多来自于实际案例,对九种SQL经典查询场景以及其性能影响讨论,非常便于实践,为你 ...

  6. C++ 系列:C++ 内存布局

    1 前言 了解你所使用的编程语言究竟是如何实现的,对于C++程序员可能特别有意义.首先,它可以去除我们对于所使用语言的神秘感,使我们不至于对于编译器干的活感到完全不可思议:尤其重要的是,它使我们在De ...

  7. C++ Under The Hood(中译版)

    VC++,掀起你的盖头来--谈VC++对象模型 (美)简  格雷 程化译 排版美化:恋花蝶(http://blog.csdn.net/lanphaday) 原文地址:http://blog.csdn ...

  8. Java-Jvm-07-深入浅出Jvm浅记

    文章目录 1. 走近Java 1.1 概述 1.2 Java的技术体系 1.3 Java的发展史 1.4 Java虚拟机家族 1.4.1 虚拟机始祖:Sun Classic/Exact VM 1.4. ...

  9. java中飞飞检查异常_Java复习6异常处理

    Java复习6.异常处理 20131005 前言: Java中的异常处理机制是非常强大的,相比C++ 来说,更加系统.但是我们开发人员没有很好的使用这一点.一些小的程序是没有什么问题的,但是对于大型项 ...

最新文章

  1. 分类问题的评估指标(Evaluation for Classifier)
  2. python 图片 转 pdf
  3. 央视在世界杯高清直播中占了C位 它是怎么做到的?
  4. Coherence-Enhancing Shock Filters(附源码)
  5. 《Python数据挖掘:概念、方法与实践》——1.5节小结
  6. windows7黑屏修复_如何在Windows 10更新后修复黑屏
  7. 算法练习题---回文数
  8. uni-app 官网教程
  9. 影响力最大化 IMRank 我心中的最优算法
  10. TensorFlow报错:ValueError The passed save_path is not a valid checkpoint
  11. 18个免费替代Photoshop的图像编辑软件
  12. js获取并设置lt;pgt;lt;/pgt;的显示的值。
  13. 只愿得一人心白首不分离
  14. PageX、clientX、screenX、offsetX、layerX的区别
  15. YOLOv5 Detect 参数说明
  16. 超融合一体机如何影响私有云部署
  17. 朋友问我移居香港后悔没?这回答够真实!
  18. 程序员用搞笑个性签名
  19. 付款申请单,如何追查跨级源头采购订单
  20. 当优秀成为了习惯,坚持又算的了什么?——英语活动

热门文章

  1. Jenkins 文档特别兴趣小组
  2. 判断点是否在一个矩形内
  3. Linux常用50条命令
  4. Go圣经-学习笔记之复合类型(二)
  5. 数据中心高速需求 推动光通信迈向100Gbps
  6. 完整学习git三 查看暂存区目录树 git diff
  7. 《C语言及程序设计》实践参考——转着圈加密
  8. gdb 调试 入手 实例讲解-转
  9. java servlet 学习_java学习之web基础(1):Servlet
  10. 蓝桥杯 ADV-9 算法提高 递归倒置字符数组