在没有异常的情况下,C++异常以什么方式减慢代码?

use*_*169 54 c++ exception overhead

我已经读过,使用C++异常进行异常处理有一些开销,而不是检查返回值.我只是谈论没有抛出异常时产生的开销.我还假设您需要实现实际检查返回值的代码并执行相应的操作,无论它与catch块的作用相同.并且,将异常对象与内部45个状态变量抛出的代码与为每个错误返回负整数的代码进行比较也是不公平的.

我不是仅仅基于哪个可以更快地执行来构建支持或反对C++异常的情况.我听到有人最近提出这样的情况:一旦你考虑了检查返回值和处理错误所需的所有额外簿记代码,使用异常的代码应该像基于返回代码的代码一样快.我错过了什么?

ava*_*kar 46

某些平台和某些编译器上存在与异常处理相关的成本.

也就是说,Visual Studio在构建32位目标时,将在每个具有非平凡析构函数的局部变量的函数中注册一个处理程序.基本上,它设置了一个try/finally处理程序.

另一种技术,由gccVisual Studio和64位使用,只会在抛出异常时产生开销(该技术涉及遍历调用堆栈和表查找).在很少抛出异常的情况下,这实际上可以导致更高效的代码,因为不必处理错误代码.

  • @ rich.e,是的,它不会改变.C++异常是基于Windows结构化异常构建的(不会因为所有__try/__除了构造将停止捕获C++异常而改变),并且结构化异常是Windows x86 ABI的一部分. (2认同)

Fre*_*man 11

只有try/catch和try/except块才能设置一些指令.除了最迂回的环路之外,在每种情况下,开销通常应该可以忽略不计.但是你通常不会在内部循环中使用try/catch/except.

我建议不要担心这一点,并使用分析器来代替在需要时优化代码.

  • GNU C++编译器默认使用零成本模型,即在不发生异常时没有时间开销. (9认同)

CB *_*ley 8

它完全依赖于实现,但是当没有抛出异常时,许多最近的实现几乎没有或没有性能开销.事实上你是对的.正确检查不使用异常的代码中所有函数的返回代码可能会慢于对使用异常的代码执行任何操作.

当然,您需要确定满足特定要求的性能.