C++对象模型之简述C++对象的内存分布

从上图可以看出,遍历虚函数表,并根据虚函数表中的函数地址调用函数,它先调用print函数,再调用job函数,最后调用析构函数。函数的调用顺序与Person类中的虚函数的定义顺序一致,其内存分布与第3节中的对象内存分布图相一致。从代码和运行结果,可以看出,虚函数表以NULL标志表的结束。但是虚函数表中还含有其他的数据,本人还没有清楚其作用。

5、继承对于类的对象的内存分布的影响

本文并不打算详细地介绍继承对对象的内存分布的影响,也不介绍虚函数的实现机制。这里主要给出一个经过本人测试的大概的对象内存模型,由于代码较多,不一一贴出。假设所有的类都有非static的成员变量和成员函数、static的成员变量及成员函数和virtual函数。

1)单继承(只有一个父类)类的继承关系为:class Derived : public Base

Derived类的对象的内存布局为:虚函数表指针、Base类的非static成员变量、Derived类的非static成员变量。

2)多重继承(多个父类)类的继承关系如下:class Derived : public Base1, public Base2

Derived类的对象的内存布局为:基类Base1子对象和基类Base2子对象及Derived类的非static成员变量组成。基类子对象包括其虚函数表指针和其非static的成员变量。

3)重复继承(继承的多个父类中其父类有相同的超类)

类的继承关系如下:

class Base1 : public Base

class Base2: public Base

class Derived : public Base1, public Base2

Derived类的对象的内存布局与多继承相似,但是可以看到基类Base的子对象在Derived类的对象的内存中存在一份拷贝。这样直接使用Derived中基类Base的相关成员时,就会引发歧义,可使用多重虚拟继承消除之。

4)多重虚拟继承(使用virtual方式继承,为了保证继承后父类的内存布局只会存在一份)

类的继承关系如下:class Base1 : virtual public Baseclass Base2: virtual public Baseclass Derived : public Base1, public Base2

Derived类的对象的内存布局与重复继承的类的对象的内存分布类似,,但是基类Base的子对象没有拷贝一份,在对象的内存中仅存在在一个Base类的子对象。但是它的非static成员变量放置在对象的末尾处。

却不去主动改变,而是放任它的生活态度。

C++对象模型之简述C++对象的内存分布

相关文章:

你感兴趣的文章:

标签云: