【问题标题】:Is there a relation between RTTI and exceptions?RTTI 和异常之间有关系吗?
【发布时间】:2012-04-25 16:41:53
【问题描述】:

我记得在同时禁用 RTTI 和异常的平台上以及同时启用它们的其他平台上编码。但是,我不记得在一个平台上编码会启用一个并禁用另一个。

这两个概念之间是否存在某种依赖关系?换句话说,异常是否需要 RTTI 才能起作用?还是相反?

【问题讨论】:

  • AFAIR MSVC 5 或 6 默认关闭 rtti 并打开异常。可能是错的,那是很久以前的事了。
  • orthogonality of RTTI and exceptions 上的这篇文章增加了这个话题。它表明,尽管公开的功能是独立的,但 gcc 中的异常实际上确实使用它们自己的“RTTI”版本来工作。

标签: c++ exception rtti


【解决方案1】:

不,异常不需要 RTTI 功能,反之亦然,两者都是单独的功能。

某些实现可能允许您禁用异常(gcc 中的-fnoexceptions),但我不知道有任何实现需要 RTTI 来处理异常,反之亦然。

【讨论】:

  • 也许异常不需要像 type_info 和 dynamic_cast 这样的显式 C++ RTTI 特性,但它们肯定需要某种 RTTI。抛出的异常必须能够将其类型与异常堆栈上的 catch 处理程序进行比较,这涉及某种 RTTI。
【解决方案2】:

我刚刚阅读了这个 C++ 提案“零开销确定性异常:抛出值”(http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2018/p0709r0.pdf?),我在其中读到:

"C++ 允许存在多个任意类型的活动异常对象,它们必须具有唯一的地址并且不能折叠;并且它需要在运行时使用 RTTI 来匹配处理程序,这在所有主要实现中具有静态不可预测的成本,并且可以取决于与整个程序相关联的其他内容。”

还有其他地方说:

“4) 今天的动态异常需要使用某种形式的 RTTI 来匹配处理程序。”

因此,异常和 RTTI 之间似乎存在关系

【讨论】:

    【解决方案3】:

    它们并不相互依赖,但它们都是重功能,所以如果有一个性能不好的平台,它们可能会被切到一起。

    【讨论】:

    • 这是一个相当过时的论点。异常在被抛出之前具有零运行时成本(仅应在异常情况下发生)。 RTTI 同样只是代码大小的增加。如果代码大小是一个问题,它们都会增加大小,但它们不会仅仅通过启用而影响性能。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-29
    • 2021-10-02
    • 2019-12-05
    相关资源
    最近更新 更多