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就会得到。

1602

被折叠的 条评论
为什么被折叠?



