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

深度搜索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具体指向那种对象(因此其偏移量无法知道,需要延缓到执行期才知道))
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: