当前位置: 首页 > 专利查询>北京大学专利>正文

一种高效的动态类型转换的实现方法技术

技术编号:7865401 阅读:206 留言:0更新日期:2012-10-15 00:34
本发明专利技术提供一种高效的动态类型转换的实现方法,其步骤包括:编译器对源代码进行解析并构建类继承图、首基类图和首基类链;根据类继承图构建交叉转换域;根据首基类链划分下行转换域;为每个类创建thread表,并存储到编译后的二进制程序中;在每个类的虚函数表中增加指向所述thread表的指针、处理非公有继承的private表指针和转换域表,将该扩充后的虚函数表存储到编译后的二进制程序中;编译器为每一个dynamic_cast语句生成运行时代码,通过查找thread表、private表及转换域表完成动态类型转换。本发明专利技术用于编译器等设备中,可产生高效的可执行程序,提升程序的运行时性能。

【技术实现步骤摘要】

本专利技术属于程序编译
,具体涉及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 < Cl < . . . < Cn < B (或者称作B到A的一个派生链B > Cn > . . · > Cl > A),则称B为A的父类(记作A < < B或B > > A),称A是B的子类,特别地,A的直接父类也是A的父类。在编译后的二进制程序中,同一个类的每个实例(即对象)都具有相同的内存布局。通常,每个类的对象都是由该类自有的数据成员,以及其直接父类对应的子对象构成。另外,虚继承在对象的内存布局中比较特殊。对于类A而言,如果有两个父类C和D都是直接虚继承自类B,则在A对象中只有一个B子对象,且同时被C和D子对象包含。换言之,如果A到其父类B存在η条非虚继承链和m(m > O)条虚继承链,则A对象中存在n+1个B子对象,其中I个B子对象被所有m条虚继承链上的子对象包含,其余每个B子对象都分别对应于一条非虚继承链。对于任何一个类Complete而言,及其任何一个Source类子对象,Source到Complete存在若干派生链。对其中每个派生链Source > BI >.. · > Bn > Complete,截取从Source开始的最长公有继承,构成一个派生链Source > BI > . . . >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, IS0/IEC 14882 :2003)的规定,动态类型转换的规则如下 I.如果Source与Target相同,贝u直接返回源对象src ;2.如果源对象src是空指针NULL,则返回NULL ;3.如果Target是Source的父类(上行转换),且若源对象src中有且只有一个Target类子对象tgt,并且tgt的某一条公有派生链包含src,则返回tgt。否则,返回NULL。4.如果不是前面3种情形,则Source类型必须是多态类型(即其中有虚函数)。5.如果转换目标Target*是void*,则返回源对象src的最大派生对象cmplt。6.如果不是前面几种情形,则动态类型转换必须在运行时进行如下类型检查a)如果Source是Target的某个父类(下行转换),且若源对象src的所有派生链中只包含一个Target类对象tgt,并且src的某一条公有派生链包含tgt,则返回tgt。b)如果Source与Target之间不存在父/子类关系(交叉转换),且若源对象src的某条公有派生链包含其最大派生对象cmplt,并且cmplt对象中有且只有一个Target子对象tgt,且tgt的某条公有派生链也包含cmplt,贝U返回tgt。c)否则,转换失败,返回NULL空指针。在编译时,前3条规则的动态类型转换可以直接由编译器在编译时完成,不需要运行时代码进行额外操作。因而,通常的动态类型转换的实现方案只需关注多态类型向void*(规则5)的转换、下行转换(规则6a)和交叉转换(规则6b)的运行时实现方案。现有的dynamic_cast实现,如微软的Visual C++编译器(简称VC)和GNU C++编译器(GCC)所采纳的实现方案,都面临着严重的性能问题。多态类型(见规则4)的对象通常前四个字节保存了一个虚表指针vfptr,而且每个对象通常与其第一个非虚多态直接父类共享同一个虚表指针vfptr。vfptr指向了该对象的虚函数表vftable,该表中保存了对象的虚函数指针,而在该表的底部(即地址为vfpt-4的内存位置)保存了对象的运行时类型信息RTTI。VC和GCC都是通过在运行时查找src对象的RTTI,并与Source类型和Target类型的类型信息typeinfo进行匹配。图I是一个C++不例程序的代码简图。图2展不的是附图I所不代码经过GCC编译之后,其运行时类型信息RTTI示例。在代码运行时,通过src对象的vfptr指针得到其RTTI指针,然后根据RTTI指针得到Complete类(即图中的类A)的类型信息typeinfo,该类型信息包含该类的名字、该类的直接父类数目、该类的所有直接父类的类型信息typeinfo,各直接父类的继承关系等。在GCC编译过的程序中,运行时代码通过递本文档来自技高网...

【技术保护点】

【技术特征摘要】
1.一种高效动态类型转换的实现方法,其步骤包括 1)编译器对源代码进行解析,根据解析结果在编译过程中构建类继承图和首基类图;井根据所述首基类图,构建首基类链; 2)对于每个类,编译器根据其类继承图构建交叉转换域;并根据首基类链,将该类的父类中不属于其交叉转换域的类划分为若干下行转换域; 3)对于每个类,编译器为其创建一thread表,并将其存储到编译后的ニ进制程序中;对于与该类的父类集合的交集非空的首基类链,该thread表为其保留ー表项; 4)编译器在每个类的所有虚函数表中分别增加一指向所述thread表的指针、一处理非公有继承的private表指针和ー转换域表;对姆个交叉/下行转换域,该转换域表为其保留ー表项;将该扩充后的虚函数表存储到编译后的ニ进制程序中; 5)对于姆ー个dynamic_cast语句,编译器生成运行时代码,通过查找源对象的thread表、private表以及转换域表完成动态类型转换。2.如权利要求I所述的方法,其特征在于,所述动态类型转换的目标类型是类的指针或类的引用。3.如权利要求I所述的方法,其特征在于,步骤I)所述构建首基类链的步骤包括 1)对于首基类图中的每条边,如果其是非公有继承则删除该边; 2)对于首基类图中的每条边NI— N2,如果在原始程序中,存在某个类M同时继承自NI和N2,但是M中某个N2子对象的直接派生对象不是NI,则删除该边; 3)在余下的图中,采用贪心算法,对于图中每棵树,逐个取出其中的最长...

【专利技术属性】
技术研发人员:张超韦韬黎斯达丁羽陈兆丰段镭张利华赵晓濛徐先栋李坤
申请(专利权)人:北京大学
类型:发明
国别省市:

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1