我已经阅读了很多关于C++异常和我看到的内容,特别是异常性能是一个难题.我甚至试图在g ++的内幕下看看如何在汇编中表示异常.
我是C程序员,因为我更喜欢低级语言.前段时间我决定使用C++而不是C,因为它的成本很低,它可以让我的生活更轻松(类比结构,模板等).
回到我的问题,因为我看到异常只会在它们发生时生成开销,因为它需要一长串的跳转和比较指令才能找到合适的异常处理程序.在正常的程序执行中(没有错误),异常开销等于正常的返回代码检查.我对吗?
Chr*_*ich 13
请在此处查看我对类似问题的详细回复.
异常处理开销是特定于平台的,取决于您运行的操作系统,编译器和CPU体系结构.
对于Visual Studio,Windows和x86,即使没有抛出异常,也会产生成本.编译器生成附加代码以跟踪当前"范围",该范围稍后用于确定要调用的析构函数以及从何处开始搜索异常过滤器和处理程序.范围更改由try块和使用析构函数创建对象触发.
对于Visual Studio,Windows和x86-64,如果不抛出异常,则成本基本为零.x86-64 ABI有一个比x86更严格的异常处理协议,并且操作系统做了很多繁重的工作,因此程序本身不需要跟踪尽可能多的信息来处理异常.
当例外发生时,成本很高,这就是为什么它们只应在真正特殊的情况下发生.处理x86-64上的异常比在x86上处理更加昂贵,因为该体系结构针对更常见的异常情况进行了优化.
以下是实际没有抛出异常时异常处理成本的详细回顾:
http://www.nwcpp.org/old/Meetings/2006/10.html
一般来说,在每个使用异常处理的函数中(具有try/catch块或带有析构函数的自动对象) - 编译器会生成一些额外的 prolog/epilog 代码来处理异常注册记录。
另外,在构造和销毁每个自动对象之后 - 添加了更多汇编器命令(调整异常注册记录)。
此外,某些优化可能会被禁用。尤其是当您在所谓的“异步”异常处理模型中工作时就是这种情况。
| 归档时间: |
|
| 查看次数: |
1699 次 |
| 最近记录: |