数据成员模型

数据成员模型


nonstatic数据成员

对于nonstatic成员,这是每个对象分配内存是占用做多的一部分。每个成员都有自己的私有对象。

内部编译器可能会把相同段(访问权限)的成员放在一起,C++标准只保证同一访问权限的成员变量中,后声明的变量处在高地址即可。另外,根据对其原则,成员与成员之间很可能并不是连续放置的,中间可能夹杂着许多padding空间。

static数据成员

static数据是整个类共享的数据,所以他们很可能被放置在数据段中,并不存在对象的内存中。我们不需要通过对象访问静态成员。


数据成员的绑定

在编译的时候,编译器会对整个类作用域进行解析。但是对参数列表的解析确实按照顺序开始的,比如说

using length = int;

class point{
public:
    //下面两个length都是int
    void mumble(length val){_val = val;}
    length mumble(){return _val;}
private:
    using length = double;
    //equal to "double val;"
    length val;
}

所以有时会出现防御性程序风格,总是把nested type声明放在class的开头。


数据成员的访问

Point3d a;
a.x = 10;

程序如何使用a.x是一个值得探究的问题。

对于一个nonstatic数据成员的访问存取,编译器会通过提前计算出类内的offset来访问,所以上述访问大致可以立即为:

*(&a+offset(Point3d::x))

对于虚拟继承,则需要导入一层间接性,需要通过一个指向虚基类的指针访问虚基类数据.

在多重虚拟继承的结构下,类内布局大致是开头是不变的部分,按照继承顺序分配空间,最后面紧跟着是共享空间,即被虚继承的基类。每个派生类都需要一个指针指向访问虚基类的偏移量数据。

在虚继承结构下,无论是多态访问基类的虚函数还是访问基类的数据,都需要通过基类的偏移量指针间接找到基类位置,虚函数表在虚基类的情况下也是如此。通过找到基类的虚函数指针使用基类的虚函数表。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值