8.5 RTTI的机制和开销

实现RTTI典型的方法是,通过在类的虚函数表中放置一个附加的指针。这个指针指向那个特别类型的type_info结构。typeid()表达式的结果非常简单:虚函数表指针取得type_info指针,并且产生一个对type_info结构的引用。因为这正好是一个双指针的解析操作,这是一个代价为常量时间的操作。

对于dynamic_cast<destination>(source_pointer)来说,大部分的情况是相当直观的:检索source_pointer的RTTI信息,并且为destination类型取得RTTI信息。然后,库程序确定source_pointer类型是否属于类型destination或destination的一个基类。如果该基类型不是派生类的第1个基类,那么由于多重继承的原因返回的指针将是被调整过的。在继承层次结构和虚基类的使用中,因为一个基类型可以出现多次,所以对于多重继承来说情况将会更加复杂。

因为为了dynamiccast而使用的库程序必须从头至尾对一个基类表进行检查,dynamic_cast开销可能高于typeid()(但是分别获得了不同的信息,这些信息对于问题的解决来说是必要的),找到一个基类比找到一个派生类可能需要花更多的时间。另外,dynamic_cast将任何一个类型与任何其他类型相比较;在同一层次结构中可以不受限制地进行类型比较。这就增加了由dynamic_cast使用的库程序的额外开销。