C++;当没有异常时,异常会减慢代码的速度? 我已经知道,对于异常处理,使用C++异常有一些开销,相反,检查返回值。我所说的只是在没有抛出异常时产生的开销。我还假设您需要实现实际检查返回值并执行适当操作的代码,无论什么操作都与catch块所做的操作等效。而且,将抛出包含45个状态变量的异常对象的代码与为每个错误返回负整数的代码进行比较也是不公平的 我不想仅仅建立一个C++异常的案例,或者基于它的执行速度。我听说最近有人提出,一旦考虑到检查返回值和处理错误所需的所有额外簿记代码,使用异常的代码应该与基于返回代码的代码运行得一样快。我遗漏了什么?

C++;当没有异常时,异常会减慢代码的速度? 我已经知道,对于异常处理,使用C++异常有一些开销,相反,检查返回值。我所说的只是在没有抛出异常时产生的开销。我还假设您需要实现实际检查返回值并执行适当操作的代码,无论什么操作都与catch块所做的操作等效。而且,将抛出包含45个状态变量的异常对象的代码与为每个错误返回负整数的代码进行比较也是不公平的 我不想仅仅建立一个C++异常的案例,或者基于它的执行速度。我听说最近有人提出,一旦考虑到检查返回值和处理错误所需的所有额外簿记代码,使用异常的代码应该与基于返回代码的代码运行得一样快。我遗漏了什么?,c++,exception,overhead,C++,Exception,Overhead,仅try/catch和try/except block需要一些设置说明。在任何情况下,开销通常都可以忽略不计,最长环路除外。但是您通常不会在内部循环中使用try/catch/except 我建议不要担心这一点,而是在需要的地方使用探查器来优化代码。它完全依赖于实现,但在不引发异常的情况下,许多最近的实现几乎没有性能开销。事实上你是对的。在不使用异常的代码中正确检查所有函数的返回代码可能比对使用异常的代码不执行任何操作要慢 当然,您需要衡量特定需求的性能,以确保满足特定需求。在某些平台和某些编译器

仅try/catch和try/except block需要一些设置说明。在任何情况下,开销通常都可以忽略不计,最长环路除外。但是您通常不会在内部循环中使用try/catch/except


我建议不要担心这一点,而是在需要的地方使用探查器来优化代码。

它完全依赖于实现,但在不引发异常的情况下,许多最近的实现几乎没有性能开销。事实上你是对的。在不使用异常的代码中正确检查所有函数的返回代码可能比对使用异常的代码不执行任何操作要慢


当然,您需要衡量特定需求的性能,以确保满足特定需求。

在某些平台和某些编译器上,异常处理会带来成本

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

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

异常会带来一些开销(正如其他答案所指出的)

但是现在你没有太多的选择。请尝试禁用项目中的异常,并确保所有依赖代码和库都可以编译和运行,而无需使用

它们是否在禁用异常的情况下工作


让我们假设他们这样做!然后对一些情况进行基准测试,但请注意,您必须设置一个“禁用异常”编译开关。如果没有这个开关,您仍然会有开销——即使代码从不抛出异常。

唯一的开销是~6条指令,这些指令在函数开始时添加2 SEH,在函数结束时保留它们。无论一条线中有多少次尝试/捕捉,它始终是相同的


局部变量又是什么呢?我听到人们在使用try/catch时总是抱怨它们。我不明白,因为解构器最终会被调用。此外,您不应该让异常增加超过1-3次调用。

我获取了Chip Uni的测试代码,并对其进行了一些扩展。我将代码分为两个源文件(一个有异常,一个没有)。我让每个基准运行1000次,并使用
clock\u gettime()
clock\u REALTIME
记录每个迭代的开始和结束时间。然后我计算了数据的均值和方差。我使用64位版本的g++5.2.0和clang++3.7.0在一个具有16GB RAM的Intel Core i7机箱上运行此测试,该机箱运行内核为4.2.5-1-ARCH的ArchLinux。您可以找到扩展的代码和完整的结果

g++ 没有例外
  • 平均值:30022994纳秒
  • 标准偏差:1.25327e+06纳秒
例外情况
  • 平均值:30025642纳秒
  • 标准偏差:1.83422e+06纳秒
叮当声++ 没有例外
  • 平均:20954657纳秒
  • 标准偏差:426662纳秒
例外情况
  • 平均值:23916638纳秒
  • 标准偏差:1.72583e+06纳秒

C++异常只会对clang++造成相当大的性能损失,甚至这种损失也只有14%。

others@Neil:我认为另一个问题更多的是关于内存占用(即内存/可执行文件大小开销),而这是关于执行速度的。我的答案至少是关于性能,和其他一些人一样。也许他们本不应该,但现在改变他们有点晚了:-)@Neil:哦,是的,我只是读了这个问题,但是这个问题的一些答案几乎比他们所附的问题更相关。这是真的吗?为什么尝试/捕获与具有析构函数的局部变量或临时变量不同?GNU C++编译器默认使用零成本模型,即在不发生异常时没有时间开销。我认为关于局部变量的要点是,当异常发生时,需要花费更多的修整/工作来确定要销毁什么。与正常情况相反。至少,这是我听到的。(我想他们可能会试图降低代码大小,但我不确定)大概检查返回代码的主要成本是
if
分支。在基于异常的代码中,为了抛出正确的异常,您不需要在其他地方使用
if
语句吗?关键是,如果事情可能出错,那么在某一点上,您将使用
if
语句。但是,如果下面的库抛出异常