【发布时间】: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 查找只是几个指针取消引用,但如果确实如此,则没有明确说明。
-
虽然,这个比较可能不太公平。使用
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