3.2 Data Member的布局(成员变量的布局)
C++类对象中成员变量是以什么样的空间内存而布局的呢?
对于下面一组data members(成员变量):
class Point3d {
public:
// ...
private:
float x;
static List<Point3d *> *freeList;
float y;
static const int chunkSize = 250;
float z;
};
根据前面提高过的C++的对象模型C++对象模型可知:
只有non-static成员变量和指向虚函数表的指针(没有虚函数则不会生成这个指针)保存在class object中。
其余的static成员变量和static成员函数以及non-static成员函数都存放在程序的data segment中,和class object无关。
所以:non-static成员变量在class object中的排列顺序和被声明的顺序一样,任何中间介入的static data members如freeList 和chunkSize都不会放入对象布局当中。在上述例子里,每一个Point3d对象是由三个float组成,次序是x,y,z。但它们仅仅保证“较晚出现的成员变量在class object中有较高的地址”。也就是说各个成员变量不一定连续,比如一些边界调整(alignment)就可能需要填补一些bytes在其中。