C ++ try块的运行时惩罚

时间:2012-01-10 14:53:51

标签: c++ exception-handling

  

可能重复:
  Measuring exception handling overhead in C++
  Performance when exceptions are not thrown (C++)

我听说有趣的是,即使没有异常发生,在C ++中使用“try”块也会在运行时减慢代码的速度。我搜索过,但一直无法找到任何解释或证据。有谁知道这是否真实&如果是这样的话?

2 个答案:

答案 0 :(得分:17)

答案通常是“取决于”。

这取决于编译器如何实现异常处理。

如果您正在使用MSVC并以32位Windows为目标,它会使用基于堆栈的机制,每次进入try块时都需要一些设置代码,所以是的,这意味着每次进入时都会受到处罚这样一个块,即使没有抛出异常。

实际上,每个其他平台(其他编译器以及针对64位Windows的MSVC)都使用基于表的方法,其中一些静态表在编译时生成,并且当抛出异常时,简单的表查找是执行,并且不需要将设置代码注入try块。

答案 1 :(得分:6)

实现异常有两种常见方法。

有一种,有时称为“基于表”或“DWARF”,它使用静态数据来指定如何从任何给定点展开堆栈;除非抛出异常,否则这没有运行时开销。

另一个,有时被称为“基于堆栈”,“setjmp-longjmp”或“sjlj”,维护动态数据以指定如何展开当前调用堆栈。无论何时进入或离开try块,以及何时使用非平凡的析构函数创建或销毁自动对象,都会产生一些运行时开销。

第一种在现代编译器中更为常见(当然GCC默认已经这么做了很多年);你必须检查你的编译器文档,看看它使用的是什么,以及它是否可配置。