博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Summary of Exception
阅读量:7261 次
发布时间:2019-06-29

本文共 3030 字,大约阅读时间需要 10 分钟。

0. Stack unwinding.When an exception is thrown and control passes from a try block to a handler, the C++ run time calls destructors for all automatic objects constructed since the beginning of the try block. This process is called stack unwinding.

Two notes: 1) local objects will be destructed in reverse order; 2) if another exception thrown during stack unwinding in destructing an object, as no one can handle that exception, Terminate will be called to end the program. 

ExpandedBlockStart.gif
View Code
class
 BB
{
public
:    
    BB() {  OutputDebugString(_T(
"
BB::BB()\n
"
)); }
    
virtual
 
~
BB() {  OutputDebugString(_T(
"
BB::~BB()\n
"
)); 
throw
 
0
; }
};
class
 DD : 
public
 BB
{
public
:
    DD() {  OutputDebugString(_T(
"
DD::DD()\n
"
)); }
    
~
DD() {  OutputDebugString(_T(
"
DD::~DD()\n
"
)); }
};
class
 EE
{
public
:
    EE() { OutputDebugString(_T(
"
EE::EE\n
"
)); }
    
~
EE() { OutputDebugString(_T(
"
EE::~EE\n
"
));}
};
class
 FF
{
public
:
    FF() { OutputDebugString(_T(
"
FF::FF\n
"
)); }
    
~
FF() { OutputDebugString(_T(
"
FF::~FF\n
"
)); 
/*
throw 1;
*/
}
};
int
 _tmain(
int
 argc, _TCHAR
*
 argv[])
{    
    
try
    {
        FF ff;
        EE ee;
        BB
*
 pBB 
=
 
new
 DD();
        delete pBB;
    }    
    
catch
 (...)
    {
        OutputDebugString(_T(
"
---get exception caught.\n
"
));
    }
    
return
 
0
;
}

Output:

ExpandedBlockStart.gif
View Code
FF::FF
EE::EE
BB::BB()
DD::DD()
DD::
~
DD()
BB::
~
BB()
First
-
chance exception at 
0x76d8b727
 (KernelBase.dll) 
in
 effPractice.exe: Microsoft C
++
 exception: 
int
 at memory location 
0x0045f784
..
EE::
~
EE
FF::
~
FF
---
get
 exception caught.

1. Exception Cost:
To minimize your exception-related costs, compile without support for exceptions when that is feasible; limit your use of try blocks and exception specifications to those locations where you honestly need them; and throw exceptions only under conditions that are truly exceptional.
1) level 1: compiling with exception support is the first factor to affect performance. If you compile your program without exception support, you can gain runtime performance improved. Here, exception support basically means: at runtime, there needs extra space/time to keep record of fully constructed objects so that when exception thrown, stack unwinding, objects can be destructed correctly.
2) level 2: A second cost of exception-handling arises from try blocks, and you pay it whenever you use one, i.e., whenever you decide you want to be able to catch exceptions. Different compilers implement try blocks in different ways, so the cost varies from compiler to compiler. As a rough estimate, expect your overall code size to increase by 5-10% and your runtime to go up by a similar amount if you use try blocks. This assumes no exceptions are thrown; what we're discussing here is just the cost of having try blocks in your programs. To minimize this cost, you should avoid unnecessary try blocks.
3) level 3: the cost of throwing an exception. Compared to a normal function return, returning from a function by throwing an exception may be as much as three orders of magnitude slower.

转载于:https://www.cnblogs.com/taoxu0903/archive/2011/07/28/2119458.html

你可能感兴趣的文章
JPHP试用笔记
查看>>
NHibernate 中使用 nvarchar(max) 类型
查看>>
电商大数据——用数据驱动电商和商业案例解析
查看>>
ZOJ 3635 Cinema in Akiba (第一次组队) 树状数组+二分
查看>>
数据结构很重要
查看>>
搜狗实习结束了
查看>>
unity3d中资源文件从MAX或者MAYA中导出的注意事项
查看>>
【LeetCode】128. Longest Consecutive Sequence
查看>>
使用phonegap + appframework2.0框架
查看>>
Linux命令工具基础02 文件及目录管理
查看>>
Linux 安装配置maven3.0 以及搭建nexus私服
查看>>
给Select赋值 innerHTML 不兼容IE6\IE7\IE8\IE9
查看>>
JAVA中的四种引用
查看>>
盘点前 10 名的免费跨浏览器测试工具
查看>>
Asp.Net MVC5入门学习系列③
查看>>
数学图形(1.27) 花
查看>>
Orchard模块开发全接触5:深度改造前台第二部分
查看>>
令人忧虑, 不阅读的中国人
查看>>
atitit. java queue 队列体系and自定义基于数据库的队列总结o7t
查看>>
android Handler
查看>>