最近再学习一本书,书名为《深度探索c++对象模型》,以后会将本书的学习笔记写在这里。

chapter 1  关于对象

    首先介绍一下几种对象模型,也就是对象再内存中的存在形式。

     1、简单对象模型(A Simple Object Model)

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

 

简单对象模型

       在Object中不存储任何直接的data member 或 function member, object中存储的都是指针,这个指针指向members。 这就是简单对象模型,对于此模型,可以避免诸如“不同的数据类型,需要不同的的存储空间”这一类的问题。

2、 表格驱动对象模型(A Table-driven Object Model)

    表格驱动对象模型如下图:

 

表格驱动对象模型

  在object中,只存在两个指针,一个指向member data table, 另一个指向member Function table. 在member data talbe中存在着实际的数据,在member function talbe中存在的只是成员函数的指针。

3、C++ 对象模型

    C++对象模型,是从简单对象模型派生而来,又做了很多的优化。 所有的非静态数据都存在与object中,而所有的静态数据,都存在于object之外,所有的成员函数(无论静态与非静态)也都存在与object之外。而对于虚函数,则已以下两个步骤支持之:

    (1) 每一个class产生出一堆指向virtual function的指针,存于一张表中,而通常这张表成为virtual table(vtbl).

    (2)每一个object中都会存有一个指针,指向(1)中的表,通常这个指针成为vtpr。vtpr的设定、重置等操作都是由class的构造函数,析构函数或复制拷贝函数自动完成。

以上就是几种对象模型。

下面再摘抄几句话。

  1、 C++中凡是处于一个access section中的数据,在内存中必定保证按照声明顺序在内存中进行布局。而对于多个access section中的各笔数据,内存布局则不敢保证。也就说即使你把protect放在前面,而把public放在后面,也不敢保证protect的数据在内存中排列在public前面

  2、 一个指针,不管它指向哪一种数据类型,它本身的大小时固定的。不同类型的指针之间的差异,不在于指针表示法不同,也不在其内容不同,而在于它所指向的object的类型不同。也就是说,不同类型的指针会告诉编译器对它所指向的地址及内容的不同的解释方式。类型不同,则对地址和内容的解释方式不同。