C++中的RTTI开销

Alo*_*ave 17 c++ casting rtti

在C++程序中启用RTTI的内存/性能开销是多少?
任何人都可以在RTTI机制的内部实现和相关的开销之间提出一些建议吗?
我明白如何通过使用RTTI typeiddynamic_cast,我试图了解的是运行时间如何跟踪这些信息的内部实现细节,它是如何开销?

Ale*_*ler 21

启用RTTI通常只会带来很小的开销.通常的实现带有指向对象的vtable中的类型信息结构的指针.由于必须构造vtable,所以额外的时间很短 - 就像在类中添加另一个虚函数一样.

typeid因此可以与调用虚函数相媲美. dynamic_cast速度较慢 - 它需要遍历继承层次结构才能进行转换.dynamic_cast过于频繁地呼叫可能是性能瓶颈.通过' 可以 '我的意思是它通常不会......

由于typeinfo结构需要存储在某个地方,因此可执行文件大小略有膨胀.在大多数情况下,它不相关.


Ale*_*tov 7

请阅读本文档中的相应部分.

总结一下:

  • typeid(5.3.7):找到vtable,通过找到大多数派生类对象,然后从该对象的vtable中提取type_info.与函数调用相比,它仍然很慢;

  • dynamic_cast(5.3.8):如上所述找到type_info,然后确定是否可以进行转换,然后调整指针.运行时成本取决于所涉及的两个类的类层次结构中的相对位置.目前,向下和交叉播放非常缓慢(尽管在这里您可以找到有关dynamic_cast可能(但受限制)的常量时间实现的文章).

  • 诚挚地邀请您在答案中总结"适当的部分".这样,如果链接失效,你的答案就不会变得毫无价值. (6认同)
  • TR实际上说"与_function call_相比非常慢",而不是"虚函数调用". (2认同)