如果我在项目中禁用C++异常会发生什么?

sha*_*oth 18 c++ exception-handling exception

Visual C++有一个编译器设置"启用C++异常",可以设置为"否".如果我这样设置会发生什么?我的代码从不显式抛出或捕获异常(因此第一个抛出的异常将终止程序)并且不依赖于堆栈展开 - 我是否应该从重新编译的程序中得到更多不受欢迎的行为?

bee*_*f2k 15

设置MSDN文档解释了不同的异常模式,甚至提供了代码示例来显示不同模式之间的差异.此外,这篇文章可能很有趣,尽管它已经很老了.

底线:该选项基本上启用或禁用跟踪所有对象的生命周期.这种跟踪是必需的,因为在异常的情况下,需要调用所有正确的析构函数,必须展开堆栈,并进行大量的清理工作.这种跟踪需要组织开销(=附加代码) - 可以通过将选项设置为"否"来删除.

我没有亲自试过,但看起来你仍然可以throwcatch例外,如果选项设置为"否",但缺少清理和退绕,这可能会产生非常糟糕的后果(不推荐;)..

  • 你绝对可以扔掉并抓住 - 但你需要自己管理生命.您在模块大小方面获得了相当大的优势,如果这是您关注的问题,那么这可能是理由 (3认同)

Cra*_*rks 8

当 C++ 对象由于异常而超出范围时,编译器将省略析构函数和其他堆栈展开代码,这些代码会在 C++ 对象之后进行清理。

换句话说,它省去了一堆清理代码。这将显着提高性能,但如果确实抛出异常,也会导致严重的后果。(如果你不相信我,你自己计时。)

性能差异并不是禁用异常的真正原因,除非在某些关键应用程序中您绝对有义务这样做。

  • 按照该死的链接,亲眼看看。如果你不相信,那就自己计时。我已经在我的平台上完成了。这是有代价的。 (7认同)
  • 它减少了代码大小,提高了缓存性能,并删除了大量分支,也提高了性能。 (3认同)
  • IIRC,性能差异的主要原因是在启用异常处理时编译器必须关闭一些优化。也就是说,它不能重新排列指令,以便在子例程中出现异常时部分构造对象。 (2认同)