《深度探索C++对象模型》--3 Data语意学



1Data Member的绑定

1)“memberrewriting rule”,一个inline函数实体,在整个class声明未被完全看见之前,是不会被评估求值的。所以通常将inline定义放于类声明之外。

2)但是对于argumentlist中的名称还是会在第一次遭遇时适当地决议。在externnestedtype name之间 非直觉绑定操作还是会发生,为了避免此种问题,总是把“nested type name”放于class的起始处。

2Data member的布局

C++standard,在同一个accesssection(private)中,members的排列只需符合“较晚声明的membersclassobject中有较高的地址”即可,即members并一定连续排列。

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值