C++中对象的内存映像.ppt_第1页
C++中对象的内存映像.ppt_第2页
C++中对象的内存映像.ppt_第3页
C++中对象的内存映像.ppt_第4页
C++中对象的内存映像.ppt_第5页
已阅读5页,还剩15页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、C+中对象的内存映像,1,内容,数据成员变量在内存中的布局,类在内存中的映像,多态的实现机制,集体讨论,2,typedef unsigned char BYTE; enum Color Red=0X01,Blue,Green, Yellow,Black ; struct car bool m_hasSkyLight; Color m_color; bool m_isAutoShift; double m_price; BYTE m_seatNum; ;,该结构体的对象在内存中占多少个字节?,15 ?,3,32 ,4,自然对齐,基本数据类型(short ,int ,double)的变量不能简单的

2、存储于内存中的任意地址处,它们的起始地址必须能被它们占用的字节数整除。,复合类型是由基本类型构成的,对象的起始地址要能够满足要求最严格的成员变量自然对齐的要求,如果类中有复合类型的成员变量,依次往后类推。除了整个对象要求自然对齐外,内部的成员变量也要自然对齐;编译器不仅考虑了单个对象的自然对齐要求,还考虑到了对象数组的对齐要求。,5,Car 的内存布局,Typedef unsigned char BYTE; Enum Color Red=0X01,Blue,Green, Yellow,Black ; Struct car bool m_hasSkyLight; Color m_color; b

3、ool m_isAutoShift; double m_price; BYTE m_seatNum; ;,204048:,末尾填充?,编译器按照成员变量声明的顺序分配空间。 为满足各个成员变量自然对齐的要求,可能会在末尾填充若干字节。 对象本身的自然对齐取决于自然对齐要求最高的那个成员变量。,6,如上,编译器不会随便地在任意一个内存地址上创建一个C+/C的变量和对象,它们在内存中的首地址要满足一定的条件,数据成员也不是紧挨在一起的,而且每个成员的地址也不是随意安排的,都是经过了编译器的精心规划和计算,这样才能提高对象及其成员的访问效率。,解决的办法 按照成员变量所占字节从大到小的顺序依次声明。

4、,如果满足所有成员的自然对齐,内存将会有大量的浪费,如何有效的利用内存呢?,7,Typedef unsigned char BYTE; enum Color Red=0X01,Blue,Green, Yellow,Black ; Struct car double m_price; Color m_color; bool m_hasSkyLight; bool m_isAutoShift; BYTE m_seatNum; ;,调整后,对象所占内存变为16个字节,末尾只有一个填充字节。 如果想将末尾填充的字节也利用了,可以吸收掉末尾的填充字节,在该例中,可以将m_seatNum 设置为short

5、 型。 综上所述,类的数据成员类型的选择,声明顺序即排列,采用的对齐方式,都将影响着对象的实际大小和访问效率。,8,在MS C+/C 中,支持用户在代码中显示的指定复合类型的对齐方式,可用的对齐方式有1,2,4,8,16. 复合类型对象在内存中创建后,每个成员本身的地址取决于它们相对于对象起始地址的偏移字节数,而这个偏移字节数不仅仅与排在它们前面的成员的大小有关,还与用户为这个对象类型指定的成员对齐方式有关。,#ifdef _MSC_VER #prama pack(push,4) /按4字节对齐 #endif typedef unsigned char BYTE; enum Color Red

6、=0X01,Blue,Green, Yellow,Black ; Struct car bool m_hasSkyLight; Color m_color; bool m_isAutoShift; double m_price; BYTE m_seatNum; ; #ifdef _MSC_VER #pragma pack(pop) #endif,9,声明顺序和对齐方式一经确定,每个成员的地址偏移量就确定了,不随对象的改变而改变。一个复合类型的对象在内存中满足了自然对齐的要求,但是其中一些数据成员本身却可能不是自然对齐的。上例中,按4个字节自然对齐时,其大小变为24个字节,而成员m_price

7、的地址却不能被8整除。,内容,数据成员变量在内存中的布局,类在内存中的映像,多态的实现机制,集体讨论,10,11,Class Rectangle public: Rectangle():m_length(0),m_width(0) Rectangle(). float GetLength() const return m_length; float GetWidth() const return m_width; void Draw() protected: Rectangle (const Rectangle ,12,用户内存区,Rectangle rect 1 ;,Rectangle re

8、ct 1;,. . .,程序静态数据区,m_count,代码段,Rectangle:Rectangle (const Rectangle void SetColor (float color)m_color=color;) virtual Draw()=0; /纯虚函数 private: float m_color; ; class Rectangle :public Shape public: . private: . ,15,程序静态数据区,m_count,代码段,Rectangle:Rectangle (const Rectangle void SetColor (float color)m_color=color;) virtual Draw()=0; /纯虚函数 private: float m_color; ; class Rectangle :public Shape public: . virtual int GetName() ; Private: . ,19,20,vptr 的初始化,vptr 并非static 成员,因此只能在构造函数中进行初始化。由于每一个派生类的构造函数会先调用基类的构造函数进行初始化,所以除了基类中的构造函数中vptr是初始化外,其他派生类的构造

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论