您的位置:首页 > 编程语言 > C语言/C++

深度探索C++对象模型---Data member的布局(Data member Layout)

2014-11-20 11:15 381 查看
已知下面一组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 member如:freeList和chunkSize都不会放在对象布局之中。
C++stardard要求,在同一个access section中,members的排列顺序只需符合“较晚出现的members在class Object中有较高的地址”这一条即可。也就是说各个members并不一定得连续排列。
什么东西可以介于被声明的members之间呢?
members的边界调整可能需要填补一些bytes.
编译器可能会合成一些内部使用的data members,以支持整个对象模型。vptr就是这样的东西,目前所有的编译器就把它安插在每一个“内涵virtual function之class"的Object内。
vptr 传统是放在class Object显示声明members的最后,如今也有一些编译器把vptr放在一个class Object的最前端。
C++Stardard允许编译器把哪些内部产生出来的members自由的放在任何位置上,甚至放在哪些被程序员声明出来的members之间。

C++Stardard也允许编译器将多个access sections之中的datamembers自由排列,不必在乎他们出现在class声明中的顺序。

class Point3d{
public:
...
private:
float x;
static List<Point3d*> *freeList;
private:
float y;
static const int chunkSize = 250 ;
private:
float z;
.....
}

其class Object的大小,组成都和我们先前声明的那个相同,但是members的排列顺序则视编译器而定。
目前各家编译器都是把一个以上的access sections连锁在一起,依照声明的顺序,成为一个连续区块。Access sections的多少并不会找来额外负担。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: