读书笔记《深度探索c++对象模型》(3) - 类成员变量的数据语意
一、类数据成员绑定 1.一个空类的大小不会为空,一般为一个char,即1个字节大小,其为了区分不同两个空类对象,需要一个地址来表示。 2.一个类的sizeof的大小,由多个方面影响: 1)语言本身的负担(如虚指针) 2)不同编译器对特殊情况的优化处理(如继承于一个空类的类,编译器可能做优化) 3)alignment对齐方式的限制(因为对齐的原因,成员变量的顺序有时也会对sizeof大小影响)。 3.由typedef重声明的类型在类外前面和类中均有时,则编译器可能会按照第一次被决议的那个typedef使用,因此此处存在一个缺陷,即在未发现到类中的typedef时,均使用外层的,导致类型不是预期的类中的那个类型,故而一般情况下,类中的typedef应该放在类中的起始位置处最为安全,而不是声明成员变量处;以此来解决数据成员类型绑定的问题。 二、类数据成员布局 1.非静态的数据成员在类对象中的排列顺序与其声明顺序一致,虽然中间可能会插入一些对齐需要的字节,另外一个控制访问段(public,private,protected)中的数据成员顺序一致,但不同的控制访问段的数据成员间的顺序不一定与类中声明的顺序一致。 2.类中若是有vptr,则vptr的位置可能位于类对象中的前端也可能在最后段,甚至也有可能在数据成员的中间。不过一般为最前或最后。 3