已阅读5页,还剩15页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
C 中对象的内存映像 1 内容 数据成员变量在内存中的布局 类在内存中的映像 多态的实现机制 集体讨论 2 typedefunsignedcharBYTE enumColor Red 0X01 Blue Green Yellow Black structcar boolm hasSkyLight Colorm color boolm isAutoShift doublem price BYTEm seatNum 该结构体的对象在内存中占多少个字节 15 3 32 4 自然对齐 基本数据类型 short int double 的变量不能简单的存储于内存中的任意地址处 它们的起始地址必须能被它们占用的字节数整除 复合类型是由基本类型构成的 对象的起始地址要能够满足要求最严格的成员变量自然对齐的要求 如果类中有复合类型的成员变量 依次往后类推 除了整个对象要求自然对齐外 内部的成员变量也要自然对齐 编译器不仅考虑了单个对象的自然对齐要求 还考虑到了对象数组的对齐要求 5 Car的内存布局 TypedefunsignedcharBYTE EnumColor Red 0X01 Blue Green Yellow Black Structcar boolm hasSkyLight Colorm color boolm isAutoShift doublem price BYTEm seatNum 204048 末尾填充 编译器按照成员变量声明的顺序分配空间 为满足各个成员变量自然对齐的要求 可能会在末尾填充若干字节 对象本身的自然对齐取决于自然对齐要求最高的那个成员变量 6 如上 编译器不会随便地在任意一个内存地址上创建一个C C的变量和对象 它们在内存中的首地址要满足一定的条件 数据成员也不是紧挨在一起的 而且每个成员的地址也不是随意安排的 都是经过了编译器的精心规划和计算 这样才能提高对象及其成员的访问效率 解决的办法按照成员变量所占字节从大到小的顺序依次声明 如果满足所有成员的自然对齐 内存将会有大量的浪费 如何有效的利用内存呢 7 TypedefunsignedcharBYTE enumColor Red 0X01 Blue Green Yellow Black Structcar doublem price Colorm color boolm hasSkyLight boolm isAutoShift BYTEm seatNum 调整后 对象所占内存变为16个字节 末尾只有一个填充字节 如果想将末尾填充的字节也利用了 可以吸收掉末尾的填充字节 在该例中 可以将m seatNum设置为short型 综上所述 类的数据成员类型的选择 声明顺序即排列 采用的对齐方式 都将影响着对象的实际大小和访问效率 8 在MSC C中 支持用户在代码中显示的指定复合类型的对齐方式 可用的对齐方式有1 2 4 8 16 复合类型对象在内存中创建后 每个成员本身的地址取决于它们相对于对象起始地址的偏移字节数 而这个偏移字节数不仅仅与排在它们前面的成员的大小有关 还与用户为这个对象类型指定的成员对齐方式有关 ifdef MSC VER pramapack push 4 按4字节对齐 endiftypedefunsignedcharBYTE enumColor Red 0X01 Blue Green Yellow Black Structcar boolm hasSkyLight Colorm color boolm isAutoShift doublem price BYTEm seatNum ifdef MSC VER pragmapack pop endif 9 声明顺序和对齐方式一经确定 每个成员的地址偏移量就确定了 不随对象的改变而改变 一个复合类型的对象在内存中满足了自然对齐的要求 但是其中一些数据成员本身却可能不是自然对齐的 上例中 按4个字节自然对齐时 其大小变为24个字节 而成员m price的地址却不能被8整除 内容 数据成员变量在内存中的布局 类在内存中的映像 多态的实现机制 集体讨论 10 11 ClassRectangle public Rectangle m length 0 m width 0 Rectangle floatGetLength const returnm length floatGetWidth const returnm width voidDraw protected Rectangle constRectangle 12 用户内存区 Rectanglerect1 Rectanglerect1 程序静态数据区 m count 代码段 Rectangle Rectangle constRectangle copy Rectangle operator constRectangle assign Rectangle Rectangle Rectangle Rectangle Rectangle Getlength Rectangle Getwidth Rectangle对象的内存映像 Rectangle Draw 内容 数据成员变量在内存中的布局 类在内存中的映像 多态的实现机制 集体讨论 13 14 classShape public Shape m color 0 virtual shape floatGetColorconst returnm color voidSetColor floatcolor m color color virtualDraw 0 纯虚函数private floatm color classRectangle publicShape public private 15 程序静态数据区 m count 代码段 Rectangle Rectangle constRectangle copy Rectangle operator constRectangle assign Rectangle Rectangle Rectangle Rectangle Rectangle Getlength Rectangle Getwidth Rectangle Draw type info 加上继承和多态特性的Rectangle对象模型 Shape GetColor Shape SetColor 16 增加了继承和虚函数的类的对象模型更加复杂 具体规则如下 为每一个多态类创建一个虚函数指针数组vtable 该类的所有虚函数 继承自基类的或者新增的 的地址都保存在这张表里 多态类的每一个对象中安插一个指针成员vptr 隐藏的 其类型为指向函数指针的指针 它总是指向所属的vtable 也就是说 vptr当前所在的对象是什么类型 就指向这个类型的vtable 如果基类已经插入了vptr 则派生类将继承和重用该vptr 为了支持RTTI RuntimeTypeIdentification 为每一个多态类创建一个type info对象 并把其地址保存在vtable一个固定位置 一般为第一个位置 这取决于编译器 只有虚函数访问需要经过vptr的间接寻址 增加了一层间接性 带来了一些额外的开销 17 关于vtable中虚函数指针的排列顺序 有以下规则 一个虚函数如果在当前class中第一次出现 如果在基类中已经出现过 不算第一次 则将其地址插入到该class的每一个vtable的尾部 如果派生类改写了基类的虚函数 则这个函数的地址在派生类vtable中的位置与它在基类vtable中的位置一致 也就是说虚函数第一次出现的时 它在vtable中的位置一旦确定 就不会随着派生层次的增加而改变 派生类没有改写的基类的虚函数被继承插入到派生类vtable中 且在派生类vtable中的位置与其在基类中的位置相同 即派生类的vtable布局兼容其基类的vtable 18 classShape public Shape m color 0 virtual shape floatGetColorconst returnm color voidSetColor floatcolor m color color virtualDraw 0 纯虚函数private floatm color classRectangle publicShape public virtualintGetName Private 19 20 vptr的初始化 vptr并非static成员 因此只能在构造函数中进行初始化 由于每一个派生类
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年吉林省龙井市《行测》考试备考题库含答案详解(夺分金卷)
- 2026年山西省汾阳市《行测》考试考前冲刺试卷附答案详解【达标题】
- 2025年黑龙江省同江市《行测》考试备考题库及完整答案详解【夺冠系列】
- 2025年河南省济源市《行测》考试备考题库(易错题)附答案详解
- 小学生近视筛查工作总结
- 2025年河南省项城市《行测》考试模拟试卷(能力提升)附答案详解
- 2026年广东省高州市《行测》考试模拟试卷带答案详解(完整版)
- 2025年湖南省洪江市《行测》考试考前冲刺试卷(考点梳理)附答案详解
- 2025年湖南省浏阳市《行测》考试考前冲刺试卷(易错题)附答案详解
- 绵阳中考音乐试题及答案
- (高清版)WST 227-2024 临床检验项目标准操作程序编写要求
- 形成性评价在消化内科住院医师规范化培训中的意义初探
- 《基因编辑CRISPR技术原理及应用课件》
- HSE管理体系文件
- 历代公文选第一章-公文概说资料课件
- 美国专利法及实务培训-上传课件
- BIM土建工程招投标计价(建筑工程计量计价)
- 遵义微电影大全
- 地产渠道市场培训
- 管道穿堤工程破堤开挖专项施工方案
- YY/T 1592-2018ABO正定型和RhD血型定型检测卡(柱凝集法)
评论
0/150
提交评论