Visual C++编译器内部:异常处理与RTTI详解
9 浏览量
更新于2024-07-14
收藏 872KB PDF 举报
在Igor Skorchinsky于2012年的Recon大会上的演讲"Compiler Internals: Exceptions and RTTI"中,他深入探讨了Visual C++和编译器内部处理异常和运行时类型识别(Runtime Type Information, RTTI)的机制。这场演讲主要关注了两个关键概念:结构化异常处理(Structured Exception Handling, SEH)和C++异常处理(C++ Exception Handling, EH)。
首先,SEH是低级别的系统层技术,它允许程序捕获并处理由操作系统(如Windows内核)或用户代码引发的异常。在Visual C++中,C++异常是建立在SEH基础之上的,这意味着尽管C++异常提供了更高级别的抽象,但在底层实现上依赖于SEH的支持。SEH使用关键字如`__try`、`__except`和`__finally`来提供编译器级别的异常处理支持,每个函数都有一个单一的异常处理器,但会根据函数范围使用不同的支持结构(称为作用域表)。
在SEH的实现细节中,异常处理框架(registration frame)被放置在栈上,除了系统所需的字段(如处理器地址和下一个指针)外,Visual C++还添加了一些特定的字段。这个框架的结构包括指向下一个成员的指针,以及用于存储异常指针和可能的其他相关信息的空间,例如结构体`EH3_EXCEPTION_REGISTRATION`。
另一方面,RTTI是C++提供的一种功能,用于在运行时查询类的信息,如类名、基类列表和虚函数指针等。这有助于在异常发生时确定异常对象的确切类型,以便进行适当的处理。然而,与C++异常处理相比,RTTI的开销通常更高,因为它涉及到动态类型检查,可能会带来性能上的影响,尤其是在追求零成本设计(zero-cost design)的情况下。
演讲者还提到了SjLj(SetJump/LongJump)异常处理模型,这是GCC和其他一些编译器中采用的一种异常处理策略,它试图平衡异常处理的效率和可移植性。SjLj模型通过设置和恢复现场(setjmp/longjmp)来管理异常,减少了异常处理过程中的间接调用,从而可能提供更快的执行速度。
Igor Skorchinsky在这场演讲中详细解释了Visual C++中的异常处理机制,包括SEH的基础结构、C++异常如何在SEH之上构建以及RTTI的使用和其潜在性能成本。对于深入理解编译器内部异常管理和优化,这场演讲提供了宝贵的见解。
2009-12-10 上传
2021-01-09 上传
2022-02-24 上传
2023-06-14 上传
2023-09-08 上传
2023-09-02 上传
2024-02-19 上传
2023-09-17 上传
2023-09-07 上传
weixin_38657115
- 粉丝: 5
- 资源: 905
最新资源
- zlib-1.2.12压缩包解析与技术要点
- 微信小程序滑动选项卡源码模版发布
- Unity虚拟人物唇同步插件Oculus Lipsync介绍
- Nginx 1.18.0版本WinSW自动安装与管理指南
- Java Swing和JDBC实现的ATM系统源码解析
- 掌握Spark Streaming与Maven集成的分布式大数据处理
- 深入学习推荐系统:教程、案例与项目实践
- Web开发者必备的取色工具软件介绍
- C语言实现李春葆数据结构实验程序
- 超市管理系统开发:asp+SQL Server 2005实战
- Redis伪集群搭建教程与实践
- 掌握网络活动细节:Wireshark v3.6.3网络嗅探工具详解
- 全面掌握美赛:建模、分析与编程实现教程
- Java图书馆系统完整项目源码及SQL文件解析
- PCtoLCD2002软件:高效图片和字符取模转换
- Java开发的体育赛事在线购票系统源码分析