异常处理

Ida*_*dan 3 c++ exception stack-unwinding

我听说有人说因为堆栈展开,异常处理有点贵.

我没有得到什么,无论我抛出异常以及是否使用"return",都会发生堆栈展开.那么区别在哪里?

例如,如果我遇到无法处理的内存问题 - 唯一的选择是停止该功能,直到我到达应该处理或通知问题的区域.那么抛出异常的另一个选择是什么?

我可以使用"return"而不是抛出异常,但那时它是一样的.我知道堆栈展开甚至可以返回六个堆栈,但所以检查返回值和"返回"组合.

欢迎解释.

小智 7

当您使用返回时,无条件地"展开"堆栈,这在概念上可以像执行单个"ret"机器代码指令一样简单.在异常情况下,堆栈展开必须搜索合适的异常处理程序,这是一项复杂得多的任务.异常路径还具有构造并可能复制异常对象的任务,这可能不是微不足道的.

  • 您应该只通过引用抛出&捕获异常.这消除了异常对象的复制 - 这是一个愚蠢的昂贵且可能导致新的例外实践.除非你正在编写你所知道的软件**性能影响超过了适用于你的案例的一些替代方案,否则它就是一个很好的讨论.与错误代码传播的分钟和容易出错的性质相比,异常在产生的代码质量方面要优越得多.正如其他评论者所指出的那样,它不应该被滥用,正如编程中的一切都是如此. (5认同)
  • C++编译器几乎肯定会创建一个excception对象的副本,这就是异常对象必须具有公共可用拷贝构造函数的原因 - 参见C++标准,第15.1节.此外,你不能"引用参考". (3认同)