在技术社区中,你可能听过这样的说法:“使用try
语句块,代码体积和执行时间大约会增加5%-10%”。我必须告诉你,这只是一个极其粗糙的经验值。
实际的性能影响取决于多个复杂因素:
- 编译器实现策略(GCC、Clang、MSVC的实现差异巨大)
- 目标架构(x86-64、ARM、MIPS等)
- 具体的使用场景(异常抛出频率、调用栈深度、RTTI使用情况)
- 编译优化级别(-O0到-O3的差异可达数十倍)
在我参与的实际项目中,这个数字的变化范围从几乎为零到高达30%都有过。
拆解"零成本异常"的神话
让我们首先澄清一个被广泛误解的概念——“零成本异常”(Zero-Cost Exception)。许多开发者认为C++的异常处理是"免费"的,这是一个危险的误解。
所谓的"零成本"仅仅指的是在正常执行路径(happy path)上的开销。当我们的代码按预期执行,没有抛出任何异常时,现代编译器确实能做到几乎零开销。但一旦异常被抛出,我们就进入了异常路径(unhappy path),此时的代价是极其高昂的。
/**
* 正常路径示例 -