More Effective C++ 条款15 了解异常处理(exception handling)的成本
1. 为了支持运行期处理exception,编译器需要做大量的簿记工作:确认如果发生异常所需要析构的对象,记录每个try语句块对应的catch子句及其能够处理的exception类型等.编译器还需要在运行期做一些对比工作:在exception抛出时适当析构对象并找出正确的catch子句等.可见exception的使用需要大量成本.
"即使从未使用任何exception处理机制",也必须付出一些成本:编译器需要一些额外空间放置某些数据结构(以记录哪些对象已被完全构造妥当);编译器需要一些额外时间以实时保证那些数据结构的正确性等.
2. 由1可知,如果编译过程加上对exception的支持,即使不适用exception处理机制,程序也会比较大,执行也比较慢.因此某些编译器厂商允许用户自行决定是否使用异常处理机制(vs2013可以通过:工程属性→配置属性→C/C++→所有选项→启用C++异常来设置),前提是程序及其所链接的程序库没有一个用到try,throw或catch.对于避免exceptions的程序库而言,这有利于编译器完成性能优化,然而也必须保证"client端抛出的exceptions绝不会传入程序库",这不仅会对"client重新定义程序库内的虚函数"带来妨碍,也会对"client定制callback函数"带来排挤影响.
3. 不同编译器以不同的方法实现try语句块,使用try语句块的代码整体膨胀大约5%~10%,执行速度也会下降这个数;
对于exception specifications,编译器也会有类似行为,因此exceptions specifications通常会招致与try语句块相同的成本;
和正常的函数返回动作相比较,抛出一个exception所导致的函数返回可能要慢3个数量级!
(以上数据根据作者的"小道消息和一些测试结果")