polymorphic_downcast、转型安全 与 运行时开销的考虑
来源:互联网 发布:minitab生成数据 编辑:程序博客网 时间:2024/06/15 22:38
有时候,使用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模式下运行一遍,没错了,然后生成发布版本——既安全、又有效率。在测试的时候找出错误,总比听用户的尖叫要好一些。
下面看一些使用代码示例:
- #include <boost/cast.hpp>
- #include <iostream>
- using namespace std;
- using namespace boost;
- struct base
- {
- virtual ~base(){};
- };
- struct derived1 : public base
- {
- void foo()
- {
- cout<<"derived1::foo()"<<endl;
- }
- };
- struct derived2 : public base
- {
- void foo()
- {
- cout<<"derived2::foo()"<<endl;
- }
- };
- void older(base* p )
- {
- derived1* pd =static_cast<derived1*>(p);
- pd->foo();
- }
- void newer(base* p )
- {
- derived1* pd= boost::polymorphic_downcast<derived1*>(p);
- pd->foo();
- };
- void main()
- {
- derived2* p =new derived2;
- older(p); //转换能够成功,但是错误没被发现:转换成功,指针无效。
- newer(p);
- }
一些建议:
1,如果正在使用向下转型,并且还需要在发行版本中获得static_cast函数的速度,那么就可以使用polymorphic_downcast函数;通过使用该函数,至少在测试阶段可以获得某些错误断言。
2,如果不能测试所有可能的转型,那么就不要使用polymorphic_downcast函数。
记住:这是一种优化方法,只有经过评测证明需要使用优化方法时,才可以应用它们。
题外话:
1,这些转型操作到底有多大的效率差异,尝试写一个时间评估函数,对比一下?
2,测试“向下转型安全”时,才用polymorphic_downcast,那么对于交叉转型的安全,这个函数能起作用吗?编程测试一下!
- #include <boost/cast.hpp>
- #include <iostream>
- using namespace std;
- using namespace boost;
- struct base
- {
- virtual ~base(){}
- };
- struct base2
- {
- virtual ~base2(){}
- };
- struct derived2 : public base ,public base2
- {
- };
- void main()
- {
- base* p =new derived2;
- base2 * p2 = boost::polymorphic_cast<base2*>(p); //It's OK for cross cast
- // base2 * p3 = polymorphic_downcast<base2*>(p); //no conversion from 'struct base *' to 'struct base2 *'
- }
看样子,polymorphic_downcast还只能处理“向下转型安全”的情况;对于交叉转型嘛,还是polymorphic_cast或者dynamic_cast适用。
参考文献:
1,超越C++标准库.Boost库导论
- polymorphic_downcast、转型安全 与 运行时开销的考虑
- polymorphic_downcast
- 向下转型与运行时类型识别
- 程序员转型应该考虑的几个方面
- 选择线程数目时谨慎考虑线程切换开销
- 多线程的开销与好处
- QueryPerformanceCounter 程序运行时间的开销探讨
- Java | 向下转型与运行时类型识别
- 金融安全期刊01:云战略下的安全思维转型与新认知
- 继承与组合----除非向上转型,否则优先考虑组合
- Boost的转换函数polymorphic_cast和polymorphic_downcast
- 函数调用时的开销
- 关于线程的总结--安全,协调,开销分析
- 一个技术人员必须考虑的问题---转型 【转】
- Java的向上转型与向下转型
- Java的向上转型与向下转型
- 上转型 与 下转型的实例
- java的向上转型与向下转型
- 语义Web
- 绝对看完有感觉的组图
- 关于JAVA对XML文件的读写
- socket传文件
- Socket简单通讯
- polymorphic_downcast、转型安全 与 运行时开销的考虑
- window.showModalDialog 缓存的问题
- No.1969 Count on Canton (ACM)
- Ruby 学习四 (类、对象和变量二 类的继承和属性)
- Sprintf,Format中格式化的常用用法!
- Visual Studio 2008的性能改进
- 大学教育之我见(一)
- 如何获得本日所在周的第一天日期与最后一天日期
- Asp.Net生成图片验证码(vb)