在某些地方,我已经读到现代英特尔处理器具有用于实现异常的低级硬件,并且大多数编译器都利用它,因为异常变得比使用变量返回结果状态更快。
这是真的吗?就返回状态/响应状态而言,是否比变量更快?阅读堆栈溢出的主题似乎与此相矛盾。
谢谢
答案 0 :(得分:14)
请注意术语“异常处理程序”存在歧义。我相信你会在谈论异常时发现硬件人员意味着:
这些都与C ++的异常处理工具无关。
作为一个反例,我至少有一个轶事数据点,其中异常比返回代码慢:这在英特尔硬件上是正常的,但是使用gcc 2.95和一组非常大的异常表代码,是在第一次抛出异常时构建的。随后的例外很快,但到那时通常会造成损害。不可否认,gcc 2.95非常古老,但它应该足以提醒您对C ++异常处理的速度进行概括,即使在英特尔硬件上也是如此。
答案 1 :(得分:11)
我不知道你在哪里读到这个,但肯定是不正确的。没有任何硬件设计师可以使特殊情况(根据定义不常见)比正常情况更快。另请注意,根据TIOBE最流行的系统语言,C甚至不支持异常。对于一种语言的异常处理来说,处理器的优化程度似乎非常不可能,因为它们的实现在编译器中甚至都没有标准化。
即使异常更快,你仍然不应该在预期目的之外使用它们,以免让世界上其他程序员感到困惑。
答案 2 :(得分:4)
没有。没有什么比将变量固定到寄存器更快。即使有明确的硬件支持,异常仍然需要内存访问等。
C ++异常在大多数情况下都不能以这种方式实现,因为c ++需要展开堆栈并破坏对象。
答案 3 :(得分:2)
答案在技术上是正确的,但高度误导。
问题的核心是观察异常是例外的。他们通常不会发生。返回错误代码时不是这种情况。即使没有错误,也会始终发生这种情况。在这种情况下,该函数仍然必须返回0
,true
或-1
,或...
现在这意味着CPU和编译器可以专门优化异常失败的函数。但重要的是要实现他们优化的,这就是非失败,非例外情况 - 以特殊情况为代价。
一旦我们意识到这一点,我们就可以看看编译器和CPU如何优化这种情况。一种常见的方法是将异常代码与普通代码分开。因此,该代码通常不会在CPU缓存中结束,因此可以包含更多有用的代码。实际上,异常代码可能根本不会在RAM中结束,而是保留在磁盘上。
另一种支持机制是CPU分支预测器。它会记住导致异常代码的分支通常不会被采用,因此预测下次它们也不会被采用。编译器甚至可以将其作为提示。但是,这个提示功能已经放弃了英特尔奔腾4;现代CPU预测分支很好。
答案 4 :(得分:0)
即使它们更快,也不应将它们用于除特殊条件之外的任何其他事物。如果你滥用它们,你的程序就更难调试了。在gdb中,你可以做一个'catch throw'并轻松找出你的程序出错的地方并抛出异常,但是如果你在常规处理过程中抛出异常则不行。
答案 5 :(得分:0)
您的问题有点不清楚,因为实施例外的含义涵盖三件事:
try
块。这个 可以没有成本,但往往会使throw
更加昂贵。有a more specific question about this on SO。throw
。有a more specific question about this on SO。throw
转到catch
,并将错误处理代码(在catch
中)加载到CPU缓存中。您应该忽略此费用,因为如果使用状态代码而不是例外,则必须支付此费用。