C ++返回值与异常性能

时间:2010-07-04 05:04:02

标签: c++ performance exception

在某些地方,我已经读到现代英特尔处理器具有用于实现异常的低级硬件,并且大多数编译器都利用它,因为异常变得比使用变量返回结果状态更快。

这是真的吗?就返回状态/响应状态而言,是否比变量更快?阅读堆栈溢出的主题似乎与此相矛盾。

谢谢

6 个答案:

答案 0 :(得分:14)

请注意术语“异常处理程序”存在歧义。我相信你会在谈论异常时发现硬件人员意味着:

  1. 硬件中断,又称信号,其处理程序有时称为异常处理程序(请参阅http://pages.cs.wisc.edu/~smoler/x86text/lect.notes/interrupts.html
  2. 机器检查异常,如果硬件出现问题则停止计算机(参见http://en.wikipedia.org/wiki/Machine_Check_Exception
  3. 这些都与C ++的异常处理工具无关。

    作为一个反例,我至少有一个轶事数据点,其中异常比返回代码慢:这在英特尔硬件上是正常的,但是使用gcc 2.95和一组非常大的异常表代码,是在第一次抛出异常时构建的。随后的例外很快,但到那时通常会造成损害。不可否认,gcc 2.95非常古老,但它应该足以提醒您对C ++异常处理的速度进行概括,即使在英特尔硬件上也是如此。

答案 1 :(得分:11)

我不知道你在哪里读到这个,但肯定是不正确的。没有任何硬件设计师可以使特殊情况(根据定义不常见)比正常情况更快。另请注意,根据TIOBE最流行的系统语言,C甚至不支持异常。对于一种语言的异常处理来说,处理器的优化程度似乎非常不可能,因为它们的实现在编译器中甚至都没有标准化。

即使异常更快,你仍然不应该在预期目的之外使用它们,以免让世界上其他程序员感到困惑。

答案 2 :(得分:4)

没有。没有什么比将变量固定到寄存器更快。即使有明确的硬件支持,异常仍然需要内存访问等。

C ++异常在大多数情况下都不能以这种方式实现,因为c ++需要展开堆栈并破坏对象。

答案 3 :(得分:2)

答案在技术上是正确的,但高度误导。

问题的核心是观察异常是例外的。他们通常不会发生。返回错误代码时不是这种情况。即使没有错误,也会始终发生这种情况。在这种情况下,该函数仍然必须返回0true-1,或...

现在这意味着CPU和编译器可以专门优化异常失败的函数。但重要的是要实现他们优化的,这就是非失败,非例外情况 - 以特殊情况为代价。

一旦我们意识到这一点,我们就可以看看编译器和CPU如何优化这种情况。一种常见的方法是将异常代码与普通代码分开。因此,该代码通常不会在CPU缓存中结束,因此可以包含更多有用的代码。实际上,异常代码可能根本不会在RAM中结束,而是保留在磁盘上。

另一种支持机制是CPU分支预测器。它会记住导致异常代码的分支通常不会被采用,因此预测下次它们也不会被采用。编译器甚至可以将其作为提示。但是,这个提示功能已经放弃了英特尔奔腾4;现代CPU预测分支很好。

答案 4 :(得分:0)

即使它们更快,也不应将它们用于除特殊条件之外的任何其他事物。如果你滥用它们,你的程序就更难调试了。在gdb中,你可以做一个'catch throw'并轻松找出你的程序出错的地方并抛出异常,但是如果你在常规处理过程中抛出异常则不行。

答案 5 :(得分:0)

您的问题有点不清楚,因为实施例外的含义涵盖三件事: