在C ++程序中启用RTTI的内存/性能开销是多少?
任何人都可以在RTTI机制的内部实施和相关的管理费用之间取一些亮点吗?
我确实了解如何通过typeid
和dynamic_cast
使用RTTI,我想知道的是运行时如何跟踪这些信息以及它是如何开销的内部实现细节?
答案 0 :(得分:20)
启用RTTI通常只会带来很小的开销。通常的实现带有指向对象的vtable中的类型信息结构的指针。由于无论如何都必须构建vtable,额外的时间很小 - 就像在类中添加另一个虚函数一样。
因此, typeid
可与调用虚函数相媲美。
dynamic_cast
速度较慢 - 需要遍历继承层次结构才能进行转换。过于频繁地调用dynamic_cast
可能成为性能瓶颈。通过'可以'我的意思是它通常不会......
由于typeinfo结构需要存储在某个地方,因此可执行文件大小存在轻微的膨胀。在大多数情况下,它不相关。
答案 1 :(得分:7)
请阅读this document中的相应部分。
总结一下:
typeid
(5.3.7):找到vtable,通过找到大多数派生类对象,然后从该对象的vtable中提取type_info。与函数调用相比,它仍然非常慢;
dynamic_cast
(5.3.8):如上所述找到type_info,然后确定是否可以进行转换,然后调整指针。运行时成本取决于所涉及的两个类的类层次结构中的相对位置。这些天,向下和交叉演员非常缓慢(尽管here你可以找到关于dynamic_cast可能(但有限制)的常量时间实现的文章。
答案 2 :(得分:1)
首先,没有办法确定指定编译器和版本需要多少开销,因为它是一个实现细节。这就是众所周知,在一些编译器中,dynamic_cast搜索类层次结构,进行字符串比较以匹配类名。
答案 3 :(得分:-5)
我想知道RTTI的想法在哪里“开销”?
我在网上看到,为了提供R.T.T.I.,一些(早期)C到C ++预处理器或翻译器,类似工具(GObject,QT,Objective-C,不确定)和其他程序。 langr。生成一些“幕后”代码,确实在内存和速度上产生了一些“开销”。
我最终读到,“开销”减少了很多次,被认为是微不足道的。
如果没有R.T.T.I,也许你想在汇编或“普通C”中编程。开销,比C ++容易得多。