【发布时间】:2014-12-03 20:36:43
【问题描述】:
我目前正在开发一个模拟工具。该工具不是交互式的。所有可能的异常都是由于编程错误(在开发期间)或损坏的输入数据。如果发生异常,程序必须终止,因为继续运行毫无意义。
所以我有两个选择:
- 使用 C++ 异常处理。优点:调试时崩溃时会得到堆栈跟踪。相反:严重 (?) 性能开销。
- 调用终止程序的错误函数。优点:快速简单。相反:没有堆栈跟踪。
问题:对性能的影响有多严重?一些异常可能源于对时间要求非常严格的函数。
如果我的考虑有什么根本上的错误,请告诉我。
【问题讨论】:
-
您是如何提出严重 性能开销的?典型的实现只在抛出异常时引入开销,而不是在采用非异常路径时。
-
@Praetorian:由于优化可能性降低,也会产生一些开销(这是
noexcept的一大原因)。不过仍然不是很严重。 -
您确定不能在
abort()上获得核心转储吗? -
了解开销的唯一方法是执行测试并计时。我不确定为什么@Deduplicator 认为会有额外的开销(如果你需要一个 if 在 throw 之前进行测试,你还需要在调用 abort 之前进行测试,两者都会以同样的方式阻止优化)。当不抛出异常时,一般情况下的异常没有开销。当你抛出它时,额外的开销并不是真正的问题,因为你将终止应用程序。
-
要跟踪编程级别错误,请使用
assert()。