[发明专利]一种高效的动态类型转换的实现方法有效
申请号: | 201210124840.X | 申请日: | 2012-04-25 |
公开(公告)号: | CN102707947A | 公开(公告)日: | 2012-10-03 |
发明(设计)人: | 张超;韦韬;黎斯达;丁羽;陈兆丰;段镭;张利华;赵晓濛;徐先栋;李坤 | 申请(专利权)人: | 北京大学 |
主分类号: | G06F9/44 | 分类号: | G06F9/44 |
代理公司: | 北京君尚知识产权代理事务所(普通合伙) 11200 | 代理人: | 余长江 |
地址: | 100871*** | 国省代码: | 北京;11 |
权利要求书: | 查看更多 | 说明书: | 查看更多 |
摘要: | |||
搜索关键词: | 一种 高效 动态 类型 转换 实现 方法 | ||
技术领域
本发明属于程序编译技术领域,具体涉及C++语言中的动态类型转换的一种高效的实现方式,可用于编译器等设备中,用于产生高效的可执行程序,提升程序的运行时性能。
背景技术
编译是利用编译程序(即编译器)将源语言(如C++等)编写的源程序翻译转换为目标程序(即可以在机器上直接执行的二进制程序)的过程,它是现代软件开发的最重要基石之
C++语言通过提供运行时类型信息(RTTI)来实现其它动态语言(如JavaScript、Python等)提供的动态类型特性,它允许一个变量在执行过程中被解释为多种类型。C++程序变量通过在运行时查找RTTI信息来获知自身的类型信息,验证是否能够被解释为目标类型,从而确保其类型安全。具体实现这一功能的是动态类型转换dynamic_cast操作符。
C++的类型包括基本类型和自定义的类(即class),动态类型转换通常是类之间的转换。C++语言中类之间的关系包括公有public、保护protected和私有private三种继承关系,另外还有一种独立的virtual虚继承关系。如果类A直接继承自类B(记作A<B,或者B>A),则称B是类A的直接父类;对于类A和B,如果存在A到B的一个继承链A<C1<...<Cn<B(或者称作B到A的一个派生链B>Cn>...>C1>A),则称B为A的父类(记作A<<B或B>>A),称A是B的子类,特别地,A的直接父类也是A的父类。
在编译后的二进制程序中,同一个类的每个实例(即对象)都具有相同的内存布局。通常,每个类的对象都是由该类自有的数据成员,以及其直接父类对应的子对象构成。另外,虚继承在对象的内存布局中比较特殊。对于类A而言,如果有两个父类C和D都是直接虚继承自类B,则在A对象中只有一个B子对象,且同时被C和D子对象包含。换言之,如果A到其父类B存在n条非虚继承链和m(m>0)条虚继承链,则A对象中存在n+1个B子对象,其中1个B子对象被所有m条虚继承链上的子对象包含,其余每个B子对象都分别对应于一条非虚继承链。
对于任何一个类Complete而言,及其任何一个Source类子对象,Source到Complete存在若干派生链。对其中每个派生链Source>B1>...>Bn>Complete,截取从Source开始的最长公有继承,构成一个派生链Source>B1>...>Bk(即该链上都是公有派生,但Bk>Bk+1不是公有派生),称该截取的派生链为该Source子对象在Complete中的一个公有派生链。
Dynamic_cast操作符的具体使用方式是dynamic_cast<TargetType>(src),其中TargetType是类的指针、类的引用或者void*。当TargetType是类的指针时,src必须是一个对象的指针,返回的也是某个对象的指针;当TargetType是类的引用时,src必须是一个对象的引用,返回某个对象的引用。
对于dynamic_cast而言,TargetType是类的指针或者类的引用,其转换规则都是类似的,只有在运行时的类型检查失败后返回值上有些差异。如果TargetType是类的引用,dynamic_cast失败时会抛出一个异常;如果TargetType是类的指针,dynamic_cast失败时返回NULL空指针。因而,为了叙述方便,本发明中假定TargetType是类的指针这种形式,而对于类的引用,本发明的实施方式仍然适用。
即假设我们考察的dynamic_cast操作具有形式:dynamic_cast<Target*>(src),其中,src是指向一个Source类型的对象的指针。同时,假定src对象的最大派生对象是cmplt(即src对象包含于cmplt对象中,但是没有其他对象包含cmplt),且cmplt的类型是Complete。
动态类型转换成功与否,依赖于源对象src的类型Source、目标类型Target、以及源对象src的最大派生对象cmplt的类型Complete这三个类型(即class)之间的关系。根据C++标准(参见The C++Standard,ISO/IEC 14882:2003)的规定,动态类型转换的规则如下:
1.如果Source与Target相同,则直接返回源对象src;
2.如果源对象src是空指针NULL,则返回NULL;
该专利技术资料仅供研究查看技术是否侵权等信息,商用须获得专利权人授权。该专利全部权利属于北京大学,未经北京大学许可,擅自商用是侵权行为。如果您想购买此专利、获得商业授权和技术合作,请联系【客服】
本文链接:http://www.vipzhuanli.com/pat/books/201210124840.X/2.html,转载请声明来源钻瓜专利网。
- 上一篇:电磁动力装置及具有该装置的汽车
- 下一篇:汽车主动防侧翻控制实车试验系统