【问题标题】:Time complexity of typeid and dynamic_cast operations in C++C++ 中 typeid 和 dynamic_cast 操作的时间复杂度
【发布时间】:2021-08-04 13:57:27
【问题描述】:

抛开所有关于使用typeid 和dynamic_cast 的必要性以及它们对代码维护的可疑影响的担忧,是否有关于这两种动态类型自省机制的性能的任何信息? The Wikipedia article on RTTI 声称:

在只需要类信息的情况下,在非多态上下文中使用 typeid 通常优于 dynamic_cast,因为 typeid 始终是一个常量时间过程,而 dynamic_cast 可能需要遍历运行时其参数的类派生格。

但是没有提供引用。因此,我想问一下这种说法是否属实,以及这两种机制中的一种是否绝对应该在性能方面优于另一种。我无法找到有关这些操作的时间复杂度界限的信息。

【问题讨论】:

  • 也许,看看 cppreference.com:typeid operator:当应用于多态类型的表达式时,对 typeid 表达式的评估可能涉及运行时开销(虚拟表查找),否则 typeid 表达式在编译时解析。
  • 感谢您的报价。对我来说,这表明复杂性是恒定的,因为 vtable 查找只是几个指针取消引用,但如果确实如此,则没有明确说明。
  • 好像是这样:Fiddling on Compiler Explorer
  • 虽然,这个比较可能不太公平。使用typeid,您可以检查特定类型,但不能检查该类型是否兼容(就像使用dynamic_cast 一样):Counter Example on Compiler Explorer
  • 看来type_info 并不需要那么便宜。这个问题谈到了使用 strcmp: stackoverflow.com/questions/49773686/… 的实现。这个 libstdc++ 文件似乎证实了:gcc.gnu.org/onlinedocs/gcc-7.5.0/libstdc++/api/… .

标签: c++ time-complexity rtti dynamic-cast typeid


【解决方案1】:

语言标准没有对任一操作的复杂性提出任何要求。因此,您引用的声明没有规范支持。它可能是基于功能如何实现,或者已经在实践中实现。

声称可取性的更大问题是,尚不清楚dynamic_cast 甚至可以在非多态上下文中使用。


如果你在做面向对象的动态多态,那么你应该更喜欢虚函数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-12-16
    • 2017-05-10
    • 2012-11-27
    • 2012-03-17
    • 1970-01-01
    • 2020-10-28
    • 2011-11-13
    相关资源
    最近更新 更多