C++ try块的运行时惩罚

Gig*_*tum 6 c++ exception-handling

可能重复:
未抛出异常时测量C++ 性能中的异常处理开销
(C++)

我听说有趣的是,即使没有异常发生,在C++中使用"try"块也会在运行时减慢代码的速度.我搜索过,但一直无法找到任何解释或证据.有谁知道这是否属实,若有,为什么?

jal*_*alf 17

通常,答案是"它取决于".

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

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

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


Mik*_*our 6

有两种常见的实现异常的方法.

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

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

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