1、Data Member的绑定
(1)“memberrewriting rule”,一个inline函数实体,在整个class声明未被完全看见之前,是不会被评估求值的。所以通常将inline定义放于类声明之外。
(2)但是对于argumentlist中的名称还是会在第一次遭遇时适当地决议。在extern和nestedtype name之间 非直觉绑定操作还是会发生,为了避免此种问题,总是把“nested type name”放于class的起始处。
2、Data member的布局
C++standard,在同一个accesssection(private等)中,members的排列只需符合“较晚声明的members在classobject中有较高的地址”即可,即members并一定连续排列。
3、Data member的存取
(1)对于staticdata members,存放在程序的datasegment中,不在于classobject中。获取一个指向其的指针时,会得到一个指向其数据类型的指针。对于不同class的同名staticdata member会采用一种机制来处理。
(2)对于nonstaticdata members,必须与classobject相关联。当用一个memberfunction 处理nonstaticdata members,会发生“implicitclass object”,即添加this指针。存取时需要在class object的起始地址再加上偏移地址。
4、“继承”与Data member
(1)多重继承时,多重派生对象和最左端的base class具有相同的起始地址,至于第二或后续的base class的地址需要加(减)中间的base class subobjects的大小。
5、对象成员的效率
对于关心效率的操作,应该实际测试,而不能推断,而且某些优化操作不一定进行。
6、指向data members的指针
(1)区分“没有指向任何data member的指针”和“指向第一个data member的指针”?
每个真正的member offset的值都被加上1,所以编译器取地址时一般都减1。
(2)取一个nonstatic data member的地址,会得到在class中的offset,而取一个绑定于真正的class object身上的data member的地址,将会得到该member在内存中的真正地址,然后减去offset就会得到。