《More Effective C++》《异常——15、了解异常处理的成本》

文章目录

  • 1、Terms15:了解异常处理的成本
    • 1.1 不使用任何异常处理特性
    • 1.2支持异常处理的编译器
    • 1.3异常处理的try块
    • 1.4异常规格
    • 1.5综合成本
  • 2、总结
  • 3、参考

1、Terms15:了解异常处理的成本

程序运行总不是一帆风顺的,可能会有各种各样的异常存在。为了在运行时处理异常,程序需要记录大量的信息。对于每一个try块,他们都必须跟踪与其相关的catch子句以及他们能够捕获的异常类型,当然这是牺牲一定性能为代价的,即使你没有使用try,throw,catch关键字,同样也要付出代价。

1.1 不使用任何异常处理特性

如果不使用异常处理特性,你就需要空间建立数据结构来跟踪对象是否被完全构造;
同时也需要CPU时间保持这些数据结构不断更新。

1.2支持异常处理的编译器

程序一般由多个独立生成的目标文件组成,只要有一个目标文件支持异常处理,或者他们链接的程序库支持异常处理,即只要程序的任何一部分使用了异常,其他部分必须也支持异常。实际上大部分支持异常处理的编译器生产商都允许你自由控制是否在生成的代码里包含支持异常的内容。但是随着时间的推移,使用异常处理的程序库开始变得普遍,采用不支持异常处理的方法进行编译变得不现实。

1.3异常处理的try块

使用异常处理的的开销除了编译器之外,第二个便是try块。只要你想捕获异常,你就要为此付出代价;粗略的估计,如果你使用try块,代码的尺寸将增加5%-10%,并且运行速度也会同比例减慢。为了减少开销,避免使用无用的try块。

1.4异常规格

编译器为异常规格生成的代码与他们为try块生成的代码一样多,所以异常规格会花掉与try块一样多的系统开销。
异常规格说明:

"异常规格"(Exception Specification)是一个早期的错误处理机制,用于声明一个函数可能抛出的异常。它的主要目的是为了使程序员能够更好地控制异常,并提供更强的类型安全性。
异常规格使用特定的异常类型列表来声明一个函数可能抛出的异常。如果函数抛出了不在列表中的异常,或者根本就没有抛出任何异常,那么程序就会调用标准库中的unexpected()函数。

1.5综合成本

异常是很少见的,这样的事件不会对整个程序的性能造成太大的影响。但是抛出一个异常还是会产生较大的开销,与一个正常的函数返回相比,通过抛出异常从函数里返回可能会慢三个数量级
事实上很难对开销进行精准的预测,所要做的是让异常开销最小化:
1)尽量采用不支持异常的方法编译程序;
2)把使用try块和异常规格限制在你确实需要的地方;
3)只有在确认为异常的情况下才抛出异常。

2、总结

书山有路勤为径,学海无涯苦作舟

3、参考

《More Effective C++》

你可能感兴趣的:(#,《More,Effective,C++》,c++,开发语言)