C 中的异常:神话还是现实?
人们普遍认为 C 中的异常非常慢。然而,在 C 98 的上下文中这仍然成立吗?
零成本模型
C 中当前使用的异常处理模型是零成本模型。该模型通过提供更有效的方法解决了 Andrei Alexandrescu 提出的问题。
零成本模型按照边桌原理运行。编译器不会设置防护和显式异常检查,而是生成一个将潜在异常点映射到处理程序的表。这意味着在正常操作期间可以抛出异常而不会导致性能损失。
异常路径成本
但是,当异常发生时,会产生性能成本。与传统的“如果(错误)”策略相比,零成本模型可以慢 10-20 倍。此成本源于边表检索期间的缓存未命中以及用于处理程序确定的 RTTI 操作。
可读性与性能
虽然异常可能会对性能产生轻微影响特殊路径,它们在可读性和易于错误处理方面的总体优势应该是首要考虑因素。可读的代码可以提高可维护性并降低出现错误的风险。
异常处理实践
当调用者无法或不愿意在本地处理错误时应使用异常。在这种情况下,异常允许错误在调用堆栈中向上传播,从而使更高级别的处理程序能够解决问题。
在某些情况下,显式错误检查可能更可取。例如,map::find 不应该抛出异常,而应该返回一个checked_ptr,如果其值为null,则在取消引用时触发异常。这种方法使调用者能够在显式检查和异常处理之间进行选择。
最终,异常和显式错误检查之间的选择应以设计考虑和代码的特定上下文为指导。
以上是C 98 中的 C 异常真的很慢:神话还是现实?的详细内容。更多信息请关注PHP中文网其他相关文章!