简单对象模型:如下图所示:

image

每一个object是一系列的slots,每一个data member或者function member都有自己的一个slot。这种模型的空间和执行效率都很低。在这个模型中,members本身并不放在object之中。只有指向member的指针才放在object内。

 

表格驱动模型:

image

对象成员变量和成员变量函数各自放在一个表中,对象中有两个指针分别指向这两个表(这种模型是支持virtual  functions 的实现方式的)

 

c++对象模型:

 

image

1. nonstatic data memger 放置在每个class object中

2. static data members放在class object之外

3. static 与 nonstatic function members被放在class objects之外的地方

4. virtual functions 以两个步骤支持:

class 产生指向virtural functions的指针,放在表格中,这个表格成为virtural table。每个对象安插一个指针,指向相关的virtual table,成为vptr。vptr的设定和重置由constructor, destructor, copy assignment完成。

type_info object (它是支持RTTI的)也是由tirtural table指出,位于表格的第一个slot中(所以在virtual  table中不光只有虚函数的地址)

 

c++对象模型布局:

1.如果没有虚函数,没有成员变量,没有普通成员函数,类定义的大小为1(用sizeof()得到),而不是0。

原因:这一个字节是编译器为了指示改类的存在而设置的。如果累中有了虚函数或者成员变量,则不需要该填充字节。

2.如果单纯的设置虚函数,类的大小就会变成四个字节。因为对象模型中仅仅包含了指向virual table的vptr,此时不需要那一个自己的填充字节。如果这个字节是nostatic memeber,那么这个类对象的大小就会变成5。

3. 同理如果仅仅有一个int型的成员变量age,此时类对象的大小也是4个字节.

4. 如果成员变量age和虚函数都存在则此时的类对象的大小为8个字节,也即int型age占有四个字节, vptr指针占有四个字节

5. 如果是两个纯虚函数,此时的类对象大小仍然是 4个字节

6. 普通成员函数,其并不位于类对象之中,它位于类内存之中,并不占用类对象的内存。