您的位置:首页 > 移动开发 > Objective-C

读书笔记《Inside the C++ Object Model》:关于对象

2017-08-19 10:52 543 查看
在C++中,有两种class data members:static和nonstatic,以及三种class member functions:static,nonstatic和virtual。

C++对象模型(The C++ Object Model)

Nonstatic data members被配置于每一个class object之内,static data members则被存放在个别的class object之外。static和nonstatic function members也被放在个别的class object之外。virtual functions则以两个步骤支持之:

1.每一个class产生出一堆指向virtual functions的指针,放在表格之中。这个表格被称为virtual table(vtbl)。

2.每一个class object被安插一个指针,指向相关的virtual table。通常这个指针被称为vptr。vptr的设定(setting)和重置(resetting)都由每一个class的constructor、destructor和copy assignment运算符自动完成。每一个class所关联的type_info object(用以支持runtime type identification,RTTI)也经由virtual table被指出来,通常放在表格的第一个slot。

在虚拟继承的情况下,base class不管在继承串链中被派生(derived)多少次,永远只会存在一个实力(称为subobject)。virtual base class的原始模型是在class object之中为每一个有关联的virtual base  class加上一个指针。其他演化出来的模型则要不是导入一个virtual base class table,就是扩充原已存在的virtual table,以便维护每一个virtual base class的位置。

C++中凡处于同一个access section的数据,必定保证以其声明顺序出现在内存布局当中。然而被放置在多个access sections中的各笔数据,排列顺序就不一定了。同理,base classes和derived classes的data members的布局也未有谁先谁后的强制规定。

在C++,多态只存在于一个个的public class体系中。

需要多少内存在能够表现一个class object?一般而言要有:

1.其nonstatic data members的总和大小。

2.加上任何由于alignment的需求而填补上去的空间(可能存在于members之间,也可能存在于集合体边界)。

3.加上为了支持virtual而由内部产生的任何额外负担。vptr

pointer或reference都只需要一个word的空间(在32位机器上是4-bytes)。

在单继承模型中,当Base指针和Derived指针都指向Derived object时,Base指针和Derived指针都是指向Derived object的第一个byte。其间的差别是,Derived指针所涵盖的地址包含整个Derived object,而Base指针所涵盖的地址只包含Derived object中的Base suboject。

当一个base class object被直接初始化为(或是被指定为)一个derived class object时,derived object就会被切割(sliced)以塞入较小的base type内存中,derived type将没有留下任何蛛丝马迹。多态于是不再呈现。

C++通过class的pointers和references来支持多态,这种程序设计风格就被称为“面向对象”(OO)。

C++也支持具体的ADT程序风格,如今被称为object-based(OB)。例如String class,一种非多态的数据类型。String class可以展示封装的非多态形式;它提供一个public接口和一个private实现品,包括数据和算法,但是不支持类型的扩充。一个OB设计可能比一个对等的OO设计速度更快而且空间更紧凑。速度快是因为所有的函数调用操作都在编译时期解析完成,对象建构起来时不需要设置virtual机制;空间紧凑则是因为每一个class object不需要负担传统上为了支持virtual机制而需要的额外负荷。不过,OB设计比较没有弹性。

在弹性(OO)和效率(OB)之间常常存在着取与舍。一个人能够有效选择其一之前,必须先清楚了解两者的行为和应用领域的需求。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: