Data Member语意
class object的大小可能比想象的要大,原因在于:
1. 由编译器自动加上的额外 data members,用以支持某些语言特性(主要是各种virtual特性)。
2. 因为alignment(边界调整)的需要。
1. Data Member的布局
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 members如freeList和chunkSize都不会被放进对象布局之中。
C++ Standard要求,在同一个access section(也就是private、public、protected等区段)中,members的排列只需符合“较晚出现的members 在class object中有较高的地址”这一条件即可。
各个members并不一定得连续排列。 中间可能会有边界调整。
C++ Standard也允许编译器将多个access sections之中的data members自由排列,不必在乎它们出现在class声明中的顺序。
2. Data Member的存取
Point3d origin, *pt = &origin;
2.1 Static Data Members
每一个 static data member 只有一个实例,存放在程序的 data segment 之中。
每次程序取用 static member时,就会被内部转化为对该唯一 extern 实例的直接取用操作。
//origin.chunkSize = 250;
Point3d::chunkSize