不抛出异常时的性能(C ++)

时间:2010-09-19 08:11:41

标签: c++ exception

我已经阅读了很多关于C ++异常和我看到的内容,特别是异常性能是一个难题。我甚至试图查看g ++的内容,看看如何在汇编中表示异常。

我是C程序员,因为我更喜欢低级语言。前段时间我决定使用C ++而不是C,因为它的成本很低,它可以让我的生活更轻松(类比结构,模板等)。

回到我的问题,因为我看到异常仅在发生时会产生开销芽,因为它需要一长串的跳转和比较指令来查找适当的异常处理在正常的程序执行中(没有错误),异常开销等于正常的返回代码检查。我是对的吗?

2 个答案:

答案 0 :(得分:13)

请参阅我对类似问题here的详细回复。

异常处理开销是特定于平台的,取决于您运行的操作系统,编译器和CPU架构。

对于Visual Studio,Windows和x86,即使没有抛出异常,也会产生成本。编译器生成附加代码以跟踪当前“范围”,该范围稍后用于确定要调用的析构函数以及从何处开始搜索异常过滤器和处理程序。范围更改由try块触发,并使用析构函数创建对象。

对于Visual Studio,Windows和x86-64,如果不抛出异常,则成本基本为零。 x86-64 ABI有一个比x86更严格的异常处理协议,并且操作系统做了很多繁重的工作,因此程序本身不需要跟踪尽可能多的信息来处理异常。

当出现异常时,成本很高,这就是为什么它们只应在真正特殊的情况下发生。处理x86-64上的异常比在x86上处理更加昂贵,因为该体系结构针对更常见的异常情况进行了优化。

答案 1 :(得分:4)

下面详细介绍了在没有实际抛出异常的情况下异常处理的成本:

http://www.nwcpp.org/old/Meetings/2006/10.html

通常,在每个使用异常处理的函数中(具有try / catch块或具有析构函数的自动对象) - 编译器会生成一些额外的prolog / epilog代码来处理expcetion注册记录。

在构造和销毁每个自动对象之后,再添加一些汇编程序命令(调整异常注册记录)。

此外,可能会禁用某些优化。特别是当您使用所谓的“异步”异常处理模型时就是这种情况。