深度搜索C++对象模型 Data 语意学-数据存取
2014-07-20 10:58
453 查看
关于sizeof():C语言中判断数据类型或者表达式长度符;不是一个函数,字节数的计算在程序编译时进行,而不是在程序执行的过程中才计算出来。
class X(); class Y: public virtual X();
class Z:public virtual X(); class A:public Y,public Z{};
第一种情况sizeof(x)=1
sizeof(Y)=8 sizeof(Z)=8 sizeof(A)=12
第二种情况sizeof(x)=1 sizeof(Y)=4 sizeof(Z)=8
sizeof(A)=8
影响sizeof 的大小3大因素
1 语言本身的额外负担:当期支持virtual base class 则其derived class 里面就会有指针 指向virtual base class subobject
或者相关表格,表格里面有derived class 的地址或者偏移量。 而指针的大小根据机器决定,32位上的为4bytes
2 编译器对于特殊情况所提供的的优化处理:传统上会将virtual
base class subobject 所占的那一个字节(空类有占有一个char 来表示地址,如果有成员就不需要这1byte)插入到派生类的固定尾部(这就导致了第一种情况Z 和Y实际占用5bytes ),但是某些编译器会提供特殊处理:就是将vxirtual base class subobject视为派生类的一部分,这种情况下virtual
base class subobject因为有成员所有无需那1byte来表示地址,所有就产生第二种情况Y和Z实际占用4个字节。
3
Alignment的限制 在大部分机器上,为了使数据更有效的在内存中被存取,会自动补齐到4的倍数(根据具体机器而定)。
所以导致上面的2种不同的字节大小
目前以第二种为主
数据成员的布局
这点没什么将的可以自己看看《 深度搜索C++对象模型》
数据成员的存取:
point3D origin,*Pt=&origin; origin.x;Pt->x;这两种获取x的方式有什么差异吗? 看具体情况而定:下面解析
1 对static Data Members 的存取
由于static Data Members 被视为一种全局变量,且不存在在类对象中,在静态 区,位置固定且唯一,因此其存储不经过object,所有无论是继承而来的静态成员数据或者其他什么的,都是直接存取,没有什么区别。
2 对nonstatic Data Memberss 的存取:
其实对非静态成员变量的存取是通过隐含的this 指针获取的。对于普通的继承或者非继承的成员变量在编译器就知道其偏移量位置,通过object 的起始地址+ 偏移量就可以知道其地址,但是有一种特殊情况(当类A是一个派生类,其继承结构中有一个virtual
base class ,并且被存取的member 例如x是从该base class 里面继承而来的,这时就无法知道Pt具体指向那种对象(因此其偏移量无法知道,需要延缓到执行期才知道))
class X(); class Y: public virtual X();
class Z:public virtual X(); class A:public Y,public Z{};
第一种情况sizeof(x)=1
sizeof(Y)=8 sizeof(Z)=8 sizeof(A)=12
第二种情况sizeof(x)=1 sizeof(Y)=4 sizeof(Z)=8
sizeof(A)=8
影响sizeof 的大小3大因素
1 语言本身的额外负担:当期支持virtual base class 则其derived class 里面就会有指针 指向virtual base class subobject
或者相关表格,表格里面有derived class 的地址或者偏移量。 而指针的大小根据机器决定,32位上的为4bytes
2 编译器对于特殊情况所提供的的优化处理:传统上会将virtual
base class subobject 所占的那一个字节(空类有占有一个char 来表示地址,如果有成员就不需要这1byte)插入到派生类的固定尾部(这就导致了第一种情况Z 和Y实际占用5bytes ),但是某些编译器会提供特殊处理:就是将vxirtual base class subobject视为派生类的一部分,这种情况下virtual
base class subobject因为有成员所有无需那1byte来表示地址,所有就产生第二种情况Y和Z实际占用4个字节。
3
Alignment的限制 在大部分机器上,为了使数据更有效的在内存中被存取,会自动补齐到4的倍数(根据具体机器而定)。
所以导致上面的2种不同的字节大小
目前以第二种为主
数据成员的布局
这点没什么将的可以自己看看《 深度搜索C++对象模型》
数据成员的存取:
point3D origin,*Pt=&origin; origin.x;Pt->x;这两种获取x的方式有什么差异吗? 看具体情况而定:下面解析
1 对static Data Members 的存取
由于static Data Members 被视为一种全局变量,且不存在在类对象中,在静态 区,位置固定且唯一,因此其存储不经过object,所有无论是继承而来的静态成员数据或者其他什么的,都是直接存取,没有什么区别。
2 对nonstatic Data Memberss 的存取:
其实对非静态成员变量的存取是通过隐含的this 指针获取的。对于普通的继承或者非继承的成员变量在编译器就知道其偏移量位置,通过object 的起始地址+ 偏移量就可以知道其地址,但是有一种特殊情况(当类A是一个派生类,其继承结构中有一个virtual
base class ,并且被存取的member 例如x是从该base class 里面继承而来的,这时就无法知道Pt具体指向那种对象(因此其偏移量无法知道,需要延缓到执行期才知道))
相关文章推荐
- 深度探索C++对象模型 Data语意学笔记
- 深度探索C++对象模型之Data语意学读书笔记
- 深度探索C++对象模型-Data语意学01
- 深度搜索C++对象模型 Function 语意学-虚拟成员函数
- 深度探索C++对象模型---data语意学
- 深度探索C++对象模型----data member的存取
- 深度搜索C++对象模型 - 数据语义学
- 深度探索C++对象模型 第三章 Data 语意学
- 深度探索C++对象模型---程序转化语意学
- 深度探索C++对象模型 第二章构造函数语意学
- 深入C++对象模型学习笔记 第3章 Data 语意学
- 深度搜索C++对象模型 - 复制构造函数
- 深度搜索C++对象模型2.2 构造函数语义学-Copy Constructor的构造操作
- 深度搜索C++对象模型 - 关于对象
- 深度探索C++对象模型 第五章 构造、析构、拷贝语意学
- 深度探索C++对象模型学习 之 C++构造函数语意学(一)
- 深入探索C++对象模型笔记之六 —— Data语意学
- 深度探索C++对象模型 Function语意学笔记
- 深度搜索C++对象模型(理念总结)
- c/c++对象模型大总结:第5-8章、数据成员的存取与布局