RTTI机制和开销
典型地,RTTI通过在类的虚函数表中放置一个额外的指针来实现。这个指针指向那个特殊类型的type_info结构。typeid( )表达式的结果是很简单的:虚函数表指针取出type_info指针,以及一个指向产生的结果type_info结构的引用。因为这只是一个双指针解除引用操作,它是一个常量时间操作。
对一个dynamic_cast<destination*>(source_pointer),大多数情况是很直接了当的:source_pointer的RTTI信息被检索到,以及对类型destination*的RTTI信息被取出。以后库路径就决定source_pointer类型是否是类型destination*或者destination*的基类。如果基类型不是派生类型的第一个基,由于多重继承返回的指针就可能被调整过了。因为在继承层次里基类型可能出现不止一次和用到虚拟基类,有多重继承的情况就更加复杂。
因为对dynamic_cast使用的库路径必须从基类的列表里搜索,dynamic_cast的开销可能高于typeid( )(但是你得到了不同的信息,可能是你的解决办法的基石),以及比起派生类可能花去较多的时间来找到基类。另外,dynamic_cast将一些类型和另外其他类型相比较,并没有限制你必须在同一个类层次里对比类型。使用dynamic_cast这就给库路径加入了额外的开销。
请继续关注.有问题请联系我!
QQ 31877784
读者反映好可以继续翻译,共同进步。