在“更有效的C ++”(第15期)一书中,我读到如果启用了异常,即使不使用异常,代码也会变得非常慢。在我看来,例外的用途有限,我试图避免它们,但这是另一个话题。
我不完全理解他的陈述:
答案 0 :(得分:6)
启用/禁用例外是什么意思?
将标志传递给编译器,该标志禁用与异常相关的标准一致性,并使其不生成任何异常支持。
如果我使用可能发生例外的DLL会怎样?
如果某个库在内部处理异常,则没有。如果它让它转移到调用者(我从来没有看到任何库那样做,因为ABI问题,但无论如何),你的程序崩溃(在最好的情况下),因为它无法处理它。如果您的代码包含DLL的包装器并将错误代码转换为异常(常见发生),那么它就像您在代码中使用异常一样。
代码整体变慢或者只是程序进入/退出的部分try / catch块会变慢吗?据作者说,两者都是真的。
请注意,您引用的书已经过时了。编译器正在发展。现代编译器使用零成本例外,如果不抛出异常,则不会产生性能成本。异常处理确实使可执行文件更大,因为它应该生成处理异常所需的所有数据和代码,但它不应该在非异常路径上使它变慢。
如何编译无异常?即使我有try / catch块,我可以这样做吗?
您可以使用特定于编译器的方式执行此操作。请参阅编译器文档。通常这样做会使编译器拒绝包含任何与异常相关的设施的代码,例如将try
指向无法识别的标识符。