[发明专利]一种高效的动态类型转换的实现方法有效

专利信息
申请号: 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;

下载完整专利技术内容需要扣除积分,VIP会员可以免费下载。

该专利技术资料仅供研究查看技术是否侵权等信息,商用须获得专利权人授权。该专利全部权利属于北京大学,未经北京大学许可,擅自商用是侵权行为。如果您想购买此专利、获得商业授权和技术合作,请联系【客服

本文链接:http://www.vipzhuanli.com/pat/books/201210124840.X/2.html,转载请声明来源钻瓜专利网。

×

专利文献下载

说明:

1、专利原文基于中国国家知识产权局专利说明书;

2、支持发明专利 、实用新型专利、外观设计专利(升级中);

3、专利数据每周两次同步更新,支持Adobe PDF格式;

4、内容包括专利技术的结构示意图流程工艺图技术构造图

5、已全新升级为极速版,下载速度显著提升!欢迎使用!

请您登陆后,进行下载,点击【登陆】 【注册】

关于我们 寻求报道 投稿须知 广告合作 版权声明 网站地图 友情链接 企业标识 联系我们

钻瓜专利网在线咨询

周一至周五 9:00-18:00

咨询在线客服咨询在线客服
tel code back_top