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

本文深入探讨了C++中DataMember的绑定、布局、存取等问题,并详细分析了不同继承方式下DataMember的行为差异及对对象大小的影响。

说起Data,首先需要注意的是字节对齐问题,这也是当时C语言常考的一个问题。另外就是如果类里面没有data,那么对象的大小会是1而不是0。最后就是C++的data里面有需要支持virtual的一些东西,vptr、__vbc、RTTI信息等。

3.1 Data Member的绑定

这个主要注意的是nested type声明需要放在class的起始处,而其他member function里面的data,可以放在class里面的任何地方。

3.2 Data Member的布局

C++对class的布局主要要求同一个access section里面的data member按照定义的顺序排列。

3.3 Data Member的存取

这里主要区别的是static和non-static,static的存取由于只有一份实体,所以用什么方式存取都一样的,而non-static的data,首先是有一个this指针的概念,另外如果是虚拟继承来的对象,还会多一层访问。

3.4 “继承”与Data Member

这一节内容很多,主要分了几个方面讨论不同情况下data member

1. 如果只有继承,没有多态,也就是没有虚函数,这里需要保证的是:“出现在derived class 中的base class subobject有其完整原样性”。

2. 加上多态即虚函数后,首先是virtual table和vptr会创建出来,当然这个创建过程会影响到constructor,另外destructor也要相应修改。对于vptr的位置,不同的编译器会有不同的实现。

3. 对于多重继承,其对象的地址会指定给最左端的base class的指针,情况和单一继承相同。另外也有某些编译器有不同的实现,但可以确定的是这样的class可能会有多个vptr。

4. 虚拟继承,基本思路也是引入一个新的指针,指向共享的内容。由于一般都比较麻烦,所以这里推荐的做法是virtual base class里面没有data member。

3.5 对象成员的效率

大概的意思是打开优化开关后,都是差不多的,只有虚拟继承的效率比较差。另外都要靠测试来检验,没有什么经验可循。

3.6 指向Data Members的指针

每个data member都是有地址的,这里把这个地址取出来,然后进行操作,另外不同编译器还有差距,会有一个相差1的不同,所以就不研究这个问题了。

已经是第二次看这本书了,感觉不同编译器的差距还是很大,有些问题没有定论,还是要结合C++编程思想看,另外也许要看看C++的设计和演化了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值