深度探索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的多少并不会找来额外负担。
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的多少并不会找来额外负担。
相关文章推荐
- 深度探索C++对象模型------Data member的绑定
- 深度探索C++对象模型----data member的存取
- 深度探索C++对象模型———Data Member的布局
- 深度探索C++对象模型---Member Function的各种调用方式
- Inside the C++ Object Model 深度探索对象模型 3-DATA 4-Function
- 深度探索C++对象模型-----带有Default Constructor的member class object
- 深度探索C++对象模型---data语意学
- 深度探索C++对象模型---Function语义学之Member的各种调用方式
- 深度探索C++对象模型之Data语意学读书笔记
- 深度探索C++对象模型 第三章 Data 语意学
- 深度探索C++对象模型复习和学习 第三章 Data 语义学(The Semantics of Data )
- 深度探索C++对象模型——Data Member的布局(2)书上的错误
- 深度探索C++对象模型 Data语意学笔记
- [深度探索C++对象模型]关于成员初始化列表(member initiallization list)
- 深度探索C++对象模型之Data语义学小测试
- 深度探索C++对象模型-Data语意学01
- 【C++】深度探索C++对象模型之虚拟成员函数(virtual member function)
- 深度探索c++对象模型之member function的具现行为
- 读【深度探索C++对象模型】【下】
- 深度探索C++对象模型2