数据成员模型
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))
对于虚拟继承,则需要导入一层间接性,需要通过一个指向虚基类的指针访问虚基类数据.
在多重虚拟继承的结构下,类内布局大致是开头是不变的部分,按照继承顺序分配空间,最后面紧跟着是共享空间,即被虚继承的基类。每个派生类都需要一个指针指向访问虚基类的偏移量数据。
在虚继承结构下,无论是多态访问基类的虚函数还是访问基类的数据,都需要通过基类的偏移量指针间接找到基类位置,虚函数表在虚基类的情况下也是如此。通过找到基类的虚函数指针使用基类的虚函数表。