如何关闭异常处理?

时间:2016-02-12 11:23:00

标签: c++ performance exception-handling

在“更有效的C ++”(第15期)一书中,我读到如果启用了异常,即使不使用异常,代码也会变得非常慢。在我看来,例外的用途有限,我试图避免它们,但这是另一个话题。

我不完全理解他的陈述:

  1. 启用/禁用例外是什么意思?它是零或多于零的try / catch块之间的区别?它是编译器标志吗?如果我使用可能发生异常的DLL会发生什么?
  2. 假设没有抛出任何异常:
    • 代码整体变慢或者只是程序进入/退出的部分try / catch块会变慢吗?据作者说,两者都是真的。
  3. 如何在没有例外的情况下编译?即使我有try / catch块,我可以这样做吗?如果我使用的DLL可能会抛出异常,我可以这样做吗?

1 个答案:

答案 0 :(得分:6)

  

启用/禁用例外是什么意思?

将标志传递给编译器,该标志禁用与异常相关的标准一致性,并使其不生成任何异常支持。

  

如果我使用可能发生例外的DLL会怎样?

如果某个库在内部处理异常,则没有。如果它让它转移到调用者(我从来没有看到任何库那样做,因为ABI问题,但无论如何),你的程序崩溃(在最好的情况下),因为它无法处理它。如果您的代码包含DLL的包装器并将错误代码转换为异常(常见发生),那么它就像您在代码中使用异常一样。

  

代码整体变慢或者只是程序进入/退出的部分try / catch块会变慢吗?据作者说,两者都是真的。

请注意,您引用的书已经过时了。编译器正在发展。现代编译器使用零成本例外,如果不抛出异常,则不会产生性能成本。异常处理确实使可执行文件更大,因为它应该生成处理异常所需的所有数据和代码,但它不应该在非异常路径上使它变慢。

  

如何编译无异常?即使我有try / catch块,我可以这样做吗?

您可以使用特定于编译器的方式执行此操作。请参阅编译器文档。通常这样做会使编译器拒绝包含任何与异常相关的设施的代码,例如将try指向无法识别的标识符。