有时候,使用dynamic_cast函数效率比较低,因为是运行时开销,我们最好使用static_cast,然而使用static_cast函数向下转型存在极大的危险[1]2.3.1,而且可能产生错误。所以,我们用dynamic_cast进行测试,安全后再采用static_cast进行向下转换;polymorphic_downcast函数使用dynamic_cast进行测试(仅在调试模式下有效),然后使用static_cast进行转换操作(两者兼顾,皆大欢喜!)。
在发布模式下,polymorphic_downcast只执行static_cast函数。这样好了:我们编程的次序也就出来了:如果需要向下转型,同时这个转型操作是性能的瓶颈的话,那么使用polymorphic_downcast吧!在debug模式下运行一遍,没错了,然后生成发布版本——既安全、又有效率。在测试的时候找出错误,总比听用户的尖叫要好一些。
下面看一些使用代码示例:
一些建议:
1,如果正在使用向下转型,并且还需要在发行版本中获得static_cast函数的速度,那么就可以使用polymorphic_downcast函数;通过使用该函数,至少在测试阶段可以获得某些错误断言。
2,如果不能测试所有可能的转型,那么就不要使用polymorphic_downcast函数。
记住:这是一种优化方法,只有经过评测证明需要使用优化方法时,才可以应用它们。
题外话:
1,这些转型操作到底有多大的效率差异,尝试写一个时间评估函数,对比一下?
2,测试“向下转型安全”时,才用polymorphic_downcast,那么对于交叉转型的安全,这个函数能起作用吗?编程测试一下!
看样子,polymorphic_downcast还只能处理“向下转型安全”的情况;对于交叉转型嘛,还是polymorphic_cast或者dynamic_cast适用。
参考文献:
1,超越C++标准库.Boost库导论