《深度探索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就会得到。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值