【问题标题】:Boost Exception handling提升异常处理
【发布时间】:2011-06-01 00:20:56
【问题描述】:

我正在考虑在我的应用程序中使用 boost 异常处理。采用 boost 异常处理的主要好处是我可以将元数据添加到异常中。这可以简化调试并允许在异常堆栈展开时向上传播更多信息。但是,我不清楚这对性能的影响。如何实现 boost 异常处理 - error_info 对象是否存储在内部映射中(每次插入时都插入 log(n))!提升异常处理的任何已知缺点!

【问题讨论】:

  • 我会猜测与实际(重新)抛出 C++ 异常的开销相比,任何可能完成的地图插入或其他元数据处理都将相形见绌。
  • 例外应该是例外的(对不起重言式)。异常处理开销应仅在没有发生异常的情况下考虑。处理 throw 异常的开销应该是无关紧要的。如果不是这种情况,则表明设计错误。
  • @atzz:这很重要,如果我抛出一个异常,我今天要捕获什么,而不是明天。
  • @ybungalobill - 我们不要为了争论而争论。如果您不同意我的意见,请以允许建设性讨论的形式重新表述您的意见。
  • @ybungalobill - 我假设软件工程师是理智的人,不会故意添加悲观情绪。把这个排除在外,记住没有什么是免费的。优化通常在开发中花费很多,在维护中花费更多。我认为异常处理不是关注性能的地方;最好保持简洁易读。异常很少发生,因此您不会在整体性能上获得任何收益。 OTOH,异常处理代码在产品演化和维护过程中非常频繁地成为焦点,因此可读性在这里付出了代价。

标签: c++ debugging boost exception-handling


【解决方案1】:

是的,错误信息存储在地图中。插入 error_info 的成本在速度(抛出和堆栈展开可能要慢得多)和空间(所有内存在捕获结束时回收,通常在堆栈展开时释放所有其他内存之后不久)都可以忽略不计。

【讨论】:

    【解决方案2】:

    正如你所提到的,据我所知,以下负载伴随着 对于运算符

    • new error_info 用于初始化 shared_ptr< error_info >

    • new exception_detail::error_info_container_impl 用于初始化intrusive_ptr< exception_detail::error_info_container>

    • operator[] 用于将这些插入 std::map< typeinfo, shared_ptr<error_info_base const> >

    我不能说这些负载在您的情况下是否重要。 如果您担心,最好在实际测量负载 环境。

    【讨论】:

      猜你喜欢
      • 2011-12-31
      • 1970-01-01
      • 2010-11-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-30
      • 1970-01-01
      相关资源
      最近更新 更多