我记得在同时禁用 RTTI 和异常的平台上以及同时启用它们的其他平台上进行编码。但是,我不记得在一个平台上编码会启用一个和禁用另一个。
这两个概念之间是否存在某种依赖关系?换句话说,异常是否需要 RTTI 才能起作用?还是相反?
不,例外不需要 RTTI 功能,反之亦然,两者都是单独的功能。
某些实现可能允许您禁用异常(gcc 中的-fnoexceptions),但我不知道有任何实现需要 RTTI 来处理异常,反之亦然。
我刚刚阅读了这个 C++ 提案“零开销确定性异常:抛出值”(http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2018/p0709r0.pdf?),其中我读:
“C++ 允许存在多个任意类型的活动异常对象,它们必须具有唯一的地址并且不能折叠;并且它需要在运行时使用 RTTI 来匹配处理程序,这在所有主要实现中具有静态不可预测的成本,并且可能取决于什么else 链接到整个程序中。”
和其他地方说:
“4) 今天的动态异常需要使用某种形式的 RTTI 来匹配处理程序。”
因此,似乎异常和 RTTI 之间存在关系
它们不相互依赖,但它们都是重功能,因此如果有一个性能不佳的平台,它们可能会被同时切割。