C++不常用关键字(__leave)
来源:互联网 发布:网络架构方案 ppt 编辑:程序博客网 时间:2024/06/07 15:36
C++不常用关键字(__leave)
总结__finally块被执行的流程时,无外乎三种情况。第一种就是顺序执行到__finally块区域内的代码,这种情况很简单,容易理解;第二种就是goto语句或return语句引发的程序控制流离开当前__try块作用域时,系统自动完成对__finally块代码的调用;第三种就是由于在__try块中出现异常时,导致程序控制流离开当前__try块作用域,这种情况下也是由系统自动完成对__finally块的调用。无论是第 2种,还是第3种情况,毫无疑问,它们都会引起很大的系统开销,编译器在编译此类程序代码时,它会为这两种情况准备很多的额外代码。一般第2种情况,被称为“局部展开(LocalUnwinding)”;第3种情况,被称为“全局展开(GlobalUnwinding)”。在后面阐述SEH实现的时候会详细分析到这一点。
第3种情况,也即由于出现异常而导致的“全局展开”,对于程序员而言,这也许是无法避免的,因为你在利用异常处理机制提高程序可靠健壮性的同时,不可避免的会引起性能上其它的一些开销。呵呵!这世界其实也算瞒公平的,有得必有失。
但是,对于第2种情况,程序员完全可以有效地避免它,避免“局部展开”引起的不必要的额外开销。实际这也是与结构化程序设计思想相一致的,也即一个程序模块应该只有一个入口和一个出口,程序模块内尽量避免使用goto语句等。但是,话虽如此,有时为了提高程序的可读性,程序员在编写代码时,有时可能不得不采用一些与结构化程序设计思想相悖的做法,例如,在一个函数中,可能有多处的return语句。针对这种情况,SEH提供了一种非常有效的折衷方案,那就是__leave关键字所起的作用,它既具有像goto语句和return语句那样类似的作用(由于检测到某个程序运行中的错误,需要马上离开当前的 __try块作用域),但是又避免了“局部展开” 的额外开销。还是看个例子吧!代码如下:
[cpp] view plain copy
#include <stdio.h> void test() { puts("hello"); __try { int* p; puts("__try块中"); // 直接跳出当前的__try作用域 __leave; p = 0; *p = 25; } __finally { // 这里会被执行吗?当然 puts("__finally块中"); } puts("world"); } void main() { __try { test(); } __except(1) { puts("__except块中"); } }
上面的程序运行结果如下:
hello
__try块中
__finally块中
world
Press any key to continue
- C++不常用关键字(__leave)
- C++不常用关键字(__leave)
- c#不常用关键字
- java不常用关键字
- C++不常用关键字
- java 不常用关键字
- C++中不常用的关键字
- C++中不常用的关键字
- C++中不常用的关键字
- C++中不常用的关键字
- C++中不常用的关键字
- C++中不常用的关键字
- C/C++语言不常用的几个关键字
- C++中不常用的关键字
- [C语言]常用关键字
- C++中不常用关键字
- 嵌入式C语言常用关键字
- 嵌入式C语言常用关键字
- 怎么创建和使用SSL证书
- JS简易秒表计时器
- Android Volley完全解析
- Xms Xmx PermSize MaxPermSize 区别
- JavaScript 中 Map 和 Object 的区别
- C++不常用关键字(__leave)
- ios layer.mask
- GUI测试自动化 -- python
- L1,L2正则化
- Git上传本地项目到远程仓库
- 【转载】APP常见崩溃原因和测试方法整理
- Antx简介(ali_PPT)(转载)
- 【Direct3D基础篇】之基本概念
- Oracle client