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

  • 4
  • 0
  • 约2.42千字
  • 约 22页
  • 2016-08-19 发布于重庆
  • 举报
深入理解c对象模型第3章

第3章 Data语意学 回顾 1.Data Member的绑定 inline Member function躯体之内的一个data member绑定操作,会在整个class声明之后完成 2.Data Member的布局 (1)在同一个access section(也就是private、public、protected等区段)中,member排列需与其出现先后一致。 (2)编译器会把一个以上的access section连锁在一起,依照申明次序成为连续区块不会由Access sections的多寡招致额外负担。 3.Data Member的存取 Point3d origin,*pt=origin; origin.x = 0.0; pt-x = 0.0; 1)对于static Data Members其存取时间和效率是一致的。 2)对于Nonstatic Data Members若无继承,则一致,有继承则指针指向的变量会不确定是子类还是基类的值。 3.4 继承与Data Member 1.只要继承不要多态 又称为具体继承,其相对与虚拟继承,不会增加空间和额外的存取时间。 为了支持将子类的对象赋给父类时数据的一致性,需要将base class Member捆绑在一起。 具体继承的内存分配如下图所示: 2.加上多态 加入虚函数会引起的额外负担: 1)virtual table的引入。 2)在每个object中导入vptr。 3)加强的constructor对vptr赋合适初值。 4)加强的distructor,抹消vptr。 vptr在class object中存放的位置 1)vptr放于class object尾端(cfront编译器)优点是,支持struct,允许c程序代码的使用。缺点是,读vptr时需要从class object的起始点量起,且需知道offset。 2)Vptr放于class object的首端,优点是可以直接通过object的指针调用virtual function。缺点是不支持c struct。 3.多重继承 自然多态:派生类和基类有相同的起始地址,其差异仅为派生类空间大,用以存放多余的nonstatic data Member。 非自然多态:基类无虚函数,而派生类有,此时若vpt放于object的首端,则derived object-base object时需要编译器介入。 多重继承的非自然多态的情况下,派生类与第二或后继base class object之间的转换。 1)值传递 Vertex3d v3d; Vertex *pv; pv = v3d; 内部转换: pv = (Vertex *)((char *)v3d + sizeof(Point3d)); 2)指针 Vertex3d *pv3d; Vertex *pv; pv = pv3d; 内部转换: pv =pv3d ? (Vertex *)((char *)pv3d + sizeof(Point3d)) : 0; 注:引用不可能为0,而指针有可能为空,因此需要对指针进行判空操作。 4.虚拟继承 Class内含一个或多个virtual base class subojects ,将被分为两部分:一部分是不变 局部,一部分是共享局部。 不变局部:不管如何衍化,始终拥有固定的 offset ,因此这部分的数据可以直接存取。 共享局部:virtual base class subobjects这一部分数据,其位置会因为每次派生操作而改变,因此只能间接存取。 不同编译器主要是共享局部的间接存取方式不同,可分为以下三种: cfront编译器会在每个derived class object中安插一些指针指向virtual base class。存取继承得来的virtual base class Member通过相关指针间接完成。 缺点:1.每个对象必须将额外的virtual base class指针。 2.虚指针继承串连增加,则间接存取时间增加。 1)加入内嵌指针,可以减少时间 2).Microsoft引入virtual base class table 3)virtual function table,其中放置virtual base class的offset(正值索引virtual functions,负值索引virtual base class offsets

文档评论(0)

1亿VIP精品文档

相关文档