Gig*_*tum 6 c++ exception-handling
我听说有趣的是,即使没有异常发生,在C++中使用"try"块也会在运行时减慢代码的速度.我搜索过,但一直无法找到任何解释或证据.有谁知道这是否属实,若有,为什么?
jal*_*alf 17
通常,答案是"它取决于".
这取决于编译器如何实现异常处理.
如果您正在使用MSVC并以32位Windows为目标,它会使用基于堆栈的机制,每次进入try块时都需要一些设置代码,所以是的,这意味着每次进入这样的块时都会受到惩罚,即使没有抛出异常.
实际上,每个其他平台(其他编译器,以及针对64位Windows的MSVC)都使用基于表的方法,其中一些静态表在编译时生成,并且当抛出异常时,执行简单的表查找,并且没有设置代码必须注入try块.
有两种常见的实现异常的方法.
一个,有时被称为"基于表"或"DWARF",使用静态数据来指定如何从任何给定点展开堆栈; 除非抛出异常,否则这没有运行时开销.
另一个,有时被称为"基于堆栈","setjmp-longjmp"或"sjlj",维护动态数据以指定如何展开当前调用堆栈.无论何时进入或离开try块,以及何时使用非平凡的析构函数创建或销毁自动对象,都会产生一些运行时开销.
第一种在现代编译器中更为常见(当然GCC默认情况下这已经做了多年); 你必须检查你的编译器文档,看看它使用的是什么,以及它是否可配置.
| 归档时间: |
|
| 查看次数: |
1439 次 |
| 最近记录: |