Data Member的布局

一,Nonstatic Data Members

nonstatic data members直接存储在每一个class object中,除非经由显示的或隐式的class object,否则没有办法直接存取他们。只要程序员在一个member function中直接处理一个nonstatic data member,所谓的隐式的class object就会发生。

class Point{
private:
    double x;
    double y;
public:
    double getX(){
        return x;
    }
};

上面定义一个Point类,getX成员函数对于x的获取是通过一个implicit class object(this指针)完成的,事实上这个成员函数的参数是

double getX(Point *const this){
    return this->x;
}


二,Static Data Members

每一个static data member只有一个实例,静态成员的存储位置独立于每个对象,即放在对象之外。每次程序取用static member时,就会被内部转化为对该唯一extern实例的直接操作。

class Point{
private:
    double x;
    double y;
    static double z;
};

例如:

Point obj;
Point *pObj = &obj;
obj.z = 20;
//Point::z = 20;

pObj->z = 30;
//Point::z = 30;


三,"继承"与Data Member(只要继承不要多态)

在C++继承模型中,一个derived class object所表现出来的东西,是其自己的members加上其base class members的总和,base class subobject在derived class中会保持原样性。下面是一个类的继承结构

class Point1{
private:
    int val;
    char bit1;
};

class Point2 : public Point1{
private:
    char bit2;
};

class Point3 : public Point2{
private:
    char bit3;
};

Point1、Point2、Point3的对象布局

Object Memory


四,加上多态

在一个类中声明一个虚函数,带来的空间和存储时间上的开销

1,编译器会创建一个与class相关的virtual table,在这个虚函数表中存储每个virtual function的地址。

2,在每一个class object中创建一个隐式的vptr指针,使每一个对象找到对应的virtual table。

3,加强constructor,使他能为vptr设定初值,让它指向class对应的virtual table。

4,加强destructor,使他能抹消"指向class之相关virtual table"的vptr。


五,一个class object的大小会受几个因素的影响

1,类中定义的nonstatic  data  member都直接存储在对象中。

2,由编译器自动加上的额外的data members,用于支撑语言特性(主要是各种virtual特性)。

3,因为内存对齐的需要。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值