《深度探索C++对象模型》第三章 Data语意学

    xiaoxiao2021-03-25  87

    首先给出以下例子:

    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

    Y,Z的内存大小受三个因素的影响: 1.语言本身造成的额外负担,指的是虚继承中在类中会产生一个指向虚表的指针,这个指针在32位的系统下是4个字节。 2.编译器对特殊情况提供的优化处理。 3.alignment限制。 Class A的大小由以下几点决定 1.被共享的 class X,为1字节。 2.class Y的大小,要减去因virtual base class X而配置的大小,结果是4bit,Z同理,Y+Z=8。 3.class A自身是0字节。 4.class A的内存对齐,8+1=9字节,要调整为4的边界,需要补充3个字节,所以结果是12个字节。


    Data member的布局 Static data members只有一个实体,存放在程序的data segment中,每次程序取用static member,都会被内部转化为对该唯一的extern实体的直接参考操作。

    Origin.chunkSize=50; //等价于这个 Point3d::chunkSize=50;

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

    &Point3d::chunkSize;//会得到const int*类型

    如何区分一个”没有指向任何data member“的指针和一个指向”第一个data member“的指针?例如:

    float Point::*p1=0; float Point::*p2=&Point::x; if(p1==p2) { //do something.. }

    为了区分p1和p2,每一个真正的member offset值都要加上1,如果要使用该值来指出一个member,要先减去1.


    指向members的指针的效率问题 为每一个“member存取操作”加上一层间接性(经由已经绑定的指针)会使得执行时间多出1倍不止,以“指向member的指针”来存取数据,再一次几乎用掉了双倍的时间,要把“指向member的指针”绑定到class object上,需要额外地把offset减去1.

    转载请注明原文地址: https://ju.6miu.com/read-25935.html

    最新回复(0)