说起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++的设计和演化了。
本文深入探讨了C++中DataMember的绑定、布局、存取等问题,并详细分析了不同继承方式下DataMember的行为差异及对对象大小的影响。

379

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



