深入理解c对象模型第3章

深入理解c对象模型第3章

ID:46853028

大小:1.08 MB

页数:22页

时间:2019-11-28

深入理解c对象模型第3章_第1页
深入理解c对象模型第3章_第2页
深入理解c对象模型第3章_第3页
深入理解c对象模型第3章_第4页
深入理解c对象模型第3章_第5页
资源描述:

《深入理解c对象模型第3章》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

1、第3章Data语意学回顾1.DataMember的绑定inlineMemberfunction躯体之内的一个datamember绑定操作,会在整个class声明之后完成2.DataMember的布局(1)在同一个accesssection(也就是private、public、protected等区段)中,member排列需与其出现先后一致。(2)编译器会把一个以上的accesssection连锁在一起,依照申明次序成为连续区块不会由Accesssections的多寡招致额外负担。3.DataMember的存取Point3dorigin,*pt=&origin

2、;origin.x=0.0;pt->x=0.0;1)对于staticDataMembers其存取时间和效率是一致的。2)对于NonstaticDataMembers若无继承,则一致,有继承则指针指向的变量会不确定是子类还是基类的值。3.4继承与DataMember1.只要继承不要多态又称为具体继承,其相对与虚拟继承,不会增加空间和额外的存取时间。为了支持将子类的对象赋给父类时数据的一致性,需要将baseclassMember捆绑在一起。具体继承的内存分配如下图所示:2.加上多态加入虚函数会引起的额外负担:1)virtualtable的引入。2)在每个obje

3、ct中导入vptr。3)加强的constructor对vptr赋合适初值。4)加强的distructor,抹消vptr。vptr在classobject中存放的位置1)vptr放于classobject尾端(cfront编译器)优点是,支持struct,允许c程序代码的使用。缺点是,读vptr时需要从classobject的起始点量起,且需知道offset。2)Vptr放于classobject的首端,优点是可以直接通过object的指针调用virtualfunction。缺点是不支持cstruct。3.多重继承自然多态:派生类和基类有相同的起始地址,其差异

4、仅为派生类空间大,用以存放多余的nonstaticdataMember。非自然多态:基类无虚函数,而派生类有,此时若vpt放于object的首端,则derivedobject->baseobject时需要编译器介入。多重继承的非自然多态的情况下,派生类与第二或后继baseclassobject之间的转换。1)值传递Vertex3dv3d;Vertex*pv;pv=&v3d;内部转换:pv=(Vertex*)((char*)&v3d+sizeof(Point3d));2)指针Vertex3d*pv3d;Vertex*pv;pv=pv3d;内部转换:pv=pv3

5、d?(Vertex*)((char*)pv3d+sizeof(Point3d)):0;注:引用不可能为0,而指针有可能为空,因此需要对指针进行判空操作。4.虚拟继承Class内含一个或多个virtualbaseclasssubojects,将被分为两部分:一部分是不变局部,一部分是共享局部。不变局部:不管如何衍化,始终拥有固定的offset,因此这部分的数据可以直接存取。共享局部:virtualbaseclasssubobjects这一部分数据,其位置会因为每次派生操作而改变,因此只能间接存取。不同编译器主要是共享局部的间接存取方式不同,可分为以下三种:cf

6、ront编译器会在每个derivedclassobject中安插一些指针指向virtualbaseclass。存取继承得来的virtualbaseclassMember通过相关指针间接完成。缺点:1.每个对象必须将额外的virtualbaseclass指针。2.虚指针继承串连增加,则间接存取时间增加。1)加入内嵌指针,可以减少时间2).Microsoft引入virtualbaseclasstable3)virtualfunctiontable,其中放置virtualbaseclass的offset(正值索引virtualfunctions,负值索引virtu

7、albaseclassoffsets)。3.5对象成员的效率优化开关打开,封装和inline存取函数不会带来额外的执行效率成本。3.6指向DataMember的指针为了区分“没有指向任何dataMember的指针”和指向“第一个datamember”的指针,在每个memberoffset值都被加1.&Point3d::z;与&origin.z;的差异在于,前者得到的是z在class中的offset,后者取一个“绑定与真正类对象的member”的地址,得到的是该member在内存中的真正地址。多重继承下,第二个baseclass的指针和一个driverclas

8、sobject绑定的member合起来将会因为需要加

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。