如何关闭异常处理?

Fab*_*ian 11 c++ performance exception-handling

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

我不完全理解他的陈述:

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

Rev*_*lot 6

启用/禁用异常意味着什么?

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

如果我使用可能发生异常的DLL会发生什么?

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

代码整体变慢还是只是程序进/出的部分try/catch块变慢?据作者说,两者都是真的.

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

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

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