我曾经阅读过一篇文章,说现代英特尔处理器具有实现异常的低级硬件,并且大多数编译器都利用它,这样异常比使用变量返回结果状态更快。
这是真的吗?就返回状态/响应状态而言,异常是否比变量更快?在Stack Overflow上阅读有关该主题的内容似乎与此相矛盾。
谢谢。
这是真的吗?就返回状态/响应状态而言,异常是否比变量更快?在Stack Overflow上阅读有关该主题的内容似乎与此相矛盾。
谢谢。
请注意,“异常处理程序”一词存在歧义。我认为您会发现,当硬件领域讨论异常时,指的是以下内容:
这两者都与 C++ 的异常处理设施无关。
作为反例,我至少有一个轶事数据点表明,异常比返回值慢得多:那是在英特尔硬件上使用 gcc 2.95 和非常大的代码集以及非常大的异常表构建的,该异常表在第一次抛出异常时被构建。随后的异常很快,但通常情况下已经造成了损害。诚然,gcc 2.95相当古老,但足以警告您不要对C ++异常处理的速度做出概括,即使是在英特尔硬件上也是如此。
我不知道你在哪里看到这个信息,但肯定是错误的。没有硬件设计师会让非常规情况,即定义上不常见的情况比正常情况运行得更快。此外,需要注意的是,根据TIOBE的数据,C语言作为最流行的系统语言之一,甚至不支持异常处理。对于处理某一种语言的异常处理的优化,其实现在编译器中也没有标准化,因此极其不可能处理器会被针对一个语言的异常处理进行优化。
即使异常确实更快,你也不应该在其意图以外的地方使用它们,否则会让全世界的其他程序员感到困惑。
不会有比将变量放入寄存器更快的方法。即使有显式的硬件支持,异常仍然需要像访问内存这样的操作。
C ++异常大部分无法以这种方式实现,因为C ++要求堆栈被展开并且对象被销毁。
这是一篇关于编程的博客文章,其中有人进行了一些实际基准测试:https://pspdfkit.com/blog/2020/performance-overhead-of-exceptions-in-cpp/
简而言之,throw
/catch
机制比返回值慢大约一个数量级,因此如果您关心性能,应该只在特殊情况下使用它。