第三章 Data语义学

来源:互联网 发布:网络小周迅BT 编辑:程序博客网 时间:2024/06/11 05:02

一个空类事实上并不是空的,它有一个隐藏1byte大小,那是被编译器安插进去的一个char,这使得这一Class的两个Object得以在内存中配置独一无二的地址

Virtual base class subobject只会在derived class中存在一份实例。

Static data member被放置在程序的一个global data segment

Data Member的绑定:

 防御性编程:把所有的data Members放在class声明的起始头处,以确定正确的绑定。把所有的inline functions,不管大小都放在class声明之外。

现在:对member functions的本体分析,会直到classd的声明都出现了才体现出来。

 把nested type声明放在class的起始处。

typedef int lengt;class point3d{public:void muble(lengt val){_val=val;}lengt muble(){return _val;}private:typedef float lengt; 此处会导致前一个全局定义出现问题lengt _val;};

Data Members的布局:

 Members的边界调整会填补一些bytes介于被声明的Members之间。

 目前各家编译器是把一个以上的access sections连锁在一起,依照声明的顺序,作为一个连续的区块。

Data Member的存取:

 若取一个static data member的地址,会得到一个指向其数据类型的指针,而不是一个指向其class member的指针,因为static member 并不含在一个class object之中。

Nonstatic data members直接存放在一个class Object中。除非经由显市的或隐式的class object this指针,否则没有办法直接存取它们。

&orgin+(&point::_y-1);orgin.y真实地址

Members的位置在编译时就固定了,因此存取Members只是一个简单的offset运算,就像单一继承一样简单,不管是经由一个指针,一个reference或是一个Object来存取。

一般而言,virtual base class最有效的一种运算形式是:一个抽象的virtual base class 没有任何的data members

 每个地址+1就是为了区分没有指向任何data members的指针和一个指向第一个data member的指针。

0 0
原创粉丝点击