Data语义学——Data Member的布局

已知下面一组data member:

1
2
3
4
5
6
7
8
9
10
class Point3d{
public:
...
private:
float x;
static List<Point3d*> *freeList;
float y;
static const int chunkSize = 250;
float z;
}

Nonstatic data members在class object中的排列顺序将与其被声明的顺序一致,任何中间介入的static data member不计入对象布局,它们被置于程序的data segment之中,与class object无关。

C++ Standard约定,在同一个access section(例如private,public,protected),members的排列只需符合“较晚出现的members在object中具备较高的地址”这一条件。也就是说,members可能在内存中并不是连续排列的,alignment造就了这种情况(填补了一些bytes)。

编译器还可能会自己生成一些data members以完成特定的功能,比如说vptr,其具体位置视编译器而定,可能在user members之前,之后,之间,只要保证满足上一段所说的要求即可。

可能一个class会由于写作原因出现多个access sections:

1
2
3
4
5
6
7
8
class Point3d{
private:
int x;
public:
int y;
private:
int x;
};

该class生成的object大小与组成均与单access section时相同,access section的多寡并不会造成额外负担。