C++异常机制的实现方式和开销分析.pdfVIP

  1. 1、本文档共12页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
C++异常机制的实现方式和开销分析.pdf

2014年10月4日 C++异常机制的实现方式和开销分析 C++异常机制的实现方式和开销分析 白杨 +44 在 Google 上推荐   在我几年前开始写 《C++编码规范与指导》一文时,就已经规划着要加入这样一篇讨论 C++ 异常机制的文章了。没 想到时隔几年以后才有机会把这个尾巴补完 :-)。 还是那句开场白: “在恰当的场合使用恰当的特性” 对每个称职的 C++ 程序员来说都是一个基本标准。想要做到 这点,就必须要了解语言中每个特性的实现方式及其时空开销。异常处理由于涉及大量底层内容,向来是 C++ 各 种高级机制中较难理解和透彻掌握的部分。本文将在尽量少引入底层细节的前提下,讨论 C++ 中这一崭新特性, 并分析其实现开销: 关于线程 函数的调用和返回 C++ 函数的调用和返回 栈回退 (Stack Unwind)机制 异常捕获机制 异常的抛出 Windows 中的结构化异常处理 异常处理机制的开销分析 小节 相关文档: C++编码规范与指导 RTTI、虚函数和虚基类的实现方式、开销分析和使用指导 多处理器环境和线程同步的高级话题 C++0x (C++11)新特性点评   关于线程 进程和线程的概念相信各位看官早已耳熟能详。在这里,我只想带大家回忆几点重要概念: 1. 一个进程中可以同时包含多个线程。   2. 我们通常认为线程是操作系统可识别的最小并发执行和调度单位 (不要跟俺说还有 Green Thread 或 者 Fiber,OS Kernel 不认识也不参与这些物件的调度)。   3. 同一进程中的多个线程共享代码段 (代码和常量)、数据段 (静态和全局变量)和扩展段 (堆存 储),但是每个线程有自己的栈段。栈段又叫运行时栈,用来存放所有局部变量和临时变量 (参数、 返回值、临时构造的变量等)。这一条对下文中的某些概念来说是非常重要的 。但是请注意,这里提 到的各个 “段”都是逻辑上的说法,在物理上某些硬件架构或者操作系统可能不使用段式存储。不过 没关系,编译器会保证这些逻辑概念和假设的前提条件对每个 C/C++ 程序员来说始终是成立的。   4. 由于共享了除栈以外的所有内存地址段,线程不可以有自己的 “静态”或 “全局”变量,为了弥补这 一缺憾,操作系统通常会提供一种称为 TLS (Thread Local Storage,即: “线程本地存储”)的机 制。通过该机制可以实现类似的功能。TLS 通常是线程控制块 (TCB)中的某个指针所指向的一个指针 数组,数组中的每个元素称为一个槽 (Slot),每个槽中的指针由使用者定义,可以指向任意位置 (但通常是指向堆存储中的某个偏移)。 /doc/cpp/inside_exception.htm 1/12 2014年10月4日 C++异常机制的实现方式和开销分析   函数的调用和返回 接着我们来回顾下一个预备知识:编译器如何实现函数的调用和返回。一般来说,编译器会为当前调用栈里的每个 函数建立一个栈框架 (Stack Frame)。 “栈框架”担负着以下重要任务: 1. 传递参数:通常,函数的调用参数总是在这个函数栈框架的最顶端。 2. 传递返回地址:告诉被调用者的 return 语句应该 return 到哪里去,通常指向该函数调用的下一条语句 (代码段中的偏移)。 3. 存放调用者的当前栈指针:便于清理被调用者的所有局部变量、并恢复调用者的现场。 4. 存放当前函数内的所有局部变量:记得吗?刚才说过所有局部和临时

文档评论(0)

ziyouzizai + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档