Data语意学

1. Data Member的布局

  Nonstatic data members在class object的排列顺序将和被声明的顺序一样,任何中间介入的static data member都不会被放进对象布局之中。static data member存放在程序的data segment中,和个别的class objects无关。


2. Data Member的存取

  i. 对于static data member,因为是在data segment中,直接进行存取;

  ii. 对于nonstatic data member,编译器需要把class object的起始地址加上data member的偏移位置(offset)。


3. 继承与Data member

  i. 只有继承,没有多态:

    具体继承(相对于虚拟继承)并不会增加空间或存取时间上的额外负担;

    

  ii. 加上多态

    虚函数导致增加的负担:

    a. 导入一个和类有关的virtual table,用来存放它所声明的每一个virtual functions的地址;

    b. 在每一个class object中导入一个vptr,提供执行期的链接,使每一个object能够找到相应的virtual table;

    c. 加强constructor,使它能够为vptr设定初值,让它指向class所对应的virtual table;

    d. 加强destructor,使它能够抹消“指向class之相关virtual table”的vptr。

  iii. 多重继承

    对一个多重派生类对象,将其地址指定给“最左端base class的指针”,情况和单一继承时相同,因为二者都指向相同的起始地址。需付出的成本只有地址的指定操作而已。至于第二个或后继的base class的地址指定操作,则需要将地址修改过:加上(或减去)介于中间的base class subobjects大小。

  iX. 虚拟继承

    

4. 指向Data Member的指针

  如何区分一个“没有指向任何data member”的指针,和一个指向“第一个data member”的指针?

  就是对每一个data member的地址值加1,即在使用该值以指出一个member之前,请先减掉1。






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值