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。