- 1、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
GCC编译器生成代码中C对象模型分析
GCC编译器生成代码中C++对象模型分析 【摘要】本文对GCC编译器编译C++程序时使用的对象模型进行了讨论,重点分析了GCC实现C++对象模型过程中采用的相关数据结构和算法。本文的分析可以帮助程序开发者及C++编译器的设计者理解GCC编译器中C++对象模型的实现机制,或在C++程序安全分析领域帮助开发者设计C++程序安全模型。 【关键词】GCC;C++;对象模型 1.引言 C++对象模型是C++编译器在编译时将代码中各种数据对象映射为二进制代码的映射方法和运行时对这些数据的检索方法的统称。一个C++编译器采用的对象模型很大程度上决定了该C++编译器的设计质量,也部分地体现了该编译器的设计思路。 本文以目前实际项目开发中广为使用的开放源代码C/C++编译器GCC为例,分析其C++对象模型的实现。选择GCC的原因主要是由于GCC允许程序员在编译过程中将其语法中间表示导出为数据文件[1]。程序员在分析GCC的过程中可以通过该中间语法表示直接获取GCC生成代码中的内部信息[2],从而大大降低分析的难度;另一方面,尽管GCC在实际项目开发中被广泛使用,但是探讨其C++代码生成逻辑的文献却相对较少。因此,分析GCC的C++对象模型实现可以作为学习GCC编译器设计的一种有效途径。本文以下的讨论均以GCC v3.3.3作为分析目标。 C++对象模型实际上包括两部分,即C++与C公有数据类型的对象模型,以及C++用于支持面向对象程序设计风格的对象模型。由于C语言数据的对象模型相对较为简单,因此本文后续的讨论中将仅仅关注GCC编译器对象模型中支持C++面向对象程序设计风格的部分。 2.GCC生成代码中的对象内存布局分析 C++面向对象机制对其对象模型中的内存布局规则存在相当的影响。其主要体现在两个方面。 (1)C++多态机制需要对象的数据成员提供支持。GCC采用文献[3]描述的虚函数表机制实现了对C++多态语义的支持。但为了支持多态语义,GCC还必须在对象中添加某些辅助数据成员; (2)C++复杂的继承语义影响了对象布局的设计。C++语言中的类继承方式分为两种,即非虚拟继承与虚拟继承。根据ISO C++98规范[4],这两种继承方式在多重继承情况下的语义存在差异。而两者的差异必然影响GCC对象模型的设计。 需要注意的是,在GCC的对象模型中,类的静态数据成员完全不影响类对象的布局。这是因为在实现时GCC总是将类静态数据成员映射为全局变量。因此,本文将不对其进行讨论。 2.1 非虚拟继承情况下的GCC对象布局模型 在非虚拟继承情况下,GCC生成代码中的对象内存布局规则可以通过如下算法表示: 算法1:非虚拟继承情况下的类对象布局生成算法 输入:派生类Derived的类定义及其直接基类Base1、Base2、……、BaseN的对象布局。 输出:派生类Derived的对象布局。 步骤: 1)检查Derived类定义中是否存在虚函数声明,若是则转3,否则转2; 2)遍历Base1、Base2、……、BaseN,检查其对象布局中是否存在虚函数入口指针,若存在则转3,否则若所有基类对象布局中均不存在虚函数入口指针,则转4; 3)检查Derived类第一个直接继承基类Base1的对象布局中是否存在虚函数入口指针,若存在则转5,否则转4; 4)在Derived类定义中添加一个隐含的非静态成员数据指针,作为Derived类对象的虚函数入口指针,并作为Derived类的第一个数据成员加入Derived类对象布局,然后转5; 5)根据Derived类继承顺序遍历基类列表,将各个直接基类的对象布局依次添加到Derived类的对象布局的末尾,然后转6; 6)根据Derived类定义中非静态数据成员的定义次序遍历每一个数据成员,将其对象布局依次添加到Derived类的对象布局末尾。 由算法1可知,非虚拟继承情况下GCC中的类对象布局可以认为是基类数据成员和派生类数据成员的简单迭加。因此在非虚拟继承情况下,GCC生成代码中派生类的基类数据成员的对象布局与真正的基类对象的布局总是保持一致。 2.2 虚拟继承情况下的GCC对象布局模型 在虚拟继承情况下,GCC生成代码中的对象布局规则可以通过如下算法表示: 算法2:虚拟继承情况下的类对象布局生成算法 输入:派生类Derived的定义及其直接和间接基类VBase1、VBase2、……、VBaseN的对象布局。 输出:派生类Derived的对象布局。 步骤: 1)在Derived类的定义中添加一个隐含的非静态数据成员指针,作为Derived类对象的虚函数入口指针,并作为Derived类的第一个数据成员加入De
文档评论(0)