读深度探索C++模型第1.1节知识点回顾

读深度探索C++模型第1.1节知识点回顾

1、c++相比c,封装后的布局成本?

c++就像c struct一样,data members直接内含在每一个class object之中,而member functions虽然含在class的声明之内,却不出现在object之中。每一个non-inline member function只会诞生一个函数实体,至于每一个“拥有零个或一个定义”的 inline function 则会在其每一个使用者(模块)身上产生一个函数实体。

C++在布局以及存取时间上主要的额外负担是由virtual引起

2、C++对象模式

①简单对象模型:

在这个简单模型中,一个object是一系列的slots,每一个slot指向一个members。Members 按其声明次序,各被指定一个slot。每一个 data member 或 function member都有自己的一个slot。

读深度探索C++模型第1.1节知识点回顾

②表格驱动对象模型:

把所有与 members 相关的信息抽出来, 放在一个 data member table 和 一个member function table 之中, class object 本身则包含指向这两个表格的指针。member function table 则直接含有 data 本身。

读深度探索C++模型第1.1节知识点回顾

③(当初的)C++对象模型:(设计者:Stroustrup)

在此模型中,Nonstatic data members 被配置于每一个 class object之内,static data members 则被存放在所有的 class object 之外, Static 和 nonstatic function members 也被放在所有的 class object之外,若class object 中 存在 virtual functions ,①每一个 class 产生一大堆 virtual functions 的指针, 放在一个虚函数表里。 ②每一个class object 被添加一个 叫做 vptr 的指针,指向相关的 虚函数表。vptr的设定与重置都由每一个class 的 construct, destructor(析构),copy assignment运算符(将已有的对象赋值个另一个已有的对象)自动完成。
此外,每一个 class 所关联的 type_info object 也被放在虚函数表里,通常放在第一个 slot 处。

读深度探索C++模型第1.1节知识点回顾

后面章节的引子:
对象模型如何影响程序呢?

不同的对象模型,会导致”现有的程序必须修改” 以及“必须加入新的程序代码”两个结果.。。。