《深度探索C++对象模型》第一章关于对象 摘录

xiaoxiao2021-02-28  110

1.C语言中"数据"和“处理数据(函数)”是分开声明的,语言本身并没有支持“数据和函数”之间的关联性,即程序性。

2.C++主要是ADT即抽象数据类型。

3.C++加上了数据和函数的封装之后,并没有增加布局成本。它的布局以及存取时间上主要的额外负担是由virtual引起的,包括

※virtual function(虚函数)机制 用以支持一个有效率的"执行器绑定"

※virtual base class(虚继承) 用以实现“多次出现在继承体系中的base class,有一个单一而被共享的实体”。

此外还有一些错冲继承下的额外负担,发生在一个子类和其第二或后继之父类的转换之间。

4.简单对象模型:在简单对象模型中,一个object(对象)是一系列的slots(位置),每一个slot指向一个members(成员)。Members按其声明次序,各被指定一个slot,每一个data member(数据成员)或function member(函数成员)都有自己的一个slot.Object 中的members是以slot的索引值来寻址。虽然这个模型并没有被应用到时机产品上,不过关于索引或slot数目的观念,倒是被应用到C++的"指向成员的指针"的观念中。

5.表格驱动对象模型:为了对所有类的所有对象都有一致的表达方式,这种模型把所有与成员相关的信息抽出来,放在一个数据成员表和一个成员函数表之中,类对象本身则含有指向这两个表格的指针。成员函数表示一系列的指针,每一个指针支出一个成员函数,数据成员表则直接含有数据本身。虽然这个模型也没有实际应用于真正的C++编译器身上,但member function table 这个观念却成为支持virtual functions的一个有效方案

6.C++对象模型:Stroustrup设计的C++模型是从简单对象模型派生而来的,并对内存空间和存取时间做了优化。在此模型中,非静态数据成员被配置到每一个类对象之内,静态数据成员则被存放所有的类对象之外,静态和非静态函数成员也被存放在类对象之外,虚函数则以两个步骤支持它:

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

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

优点:在于空间和存取时间的效率

缺点:如果应用程序代码未曾改变,但所用到的class object的nonstaic data members有所修改,那么那些应用程序代码同样得重新编译.

7.C++以下列方法支持多态: 1.经由一组隐含的转换操作。例如把一个derived class 指针转化为一个指向其public base type的指针: shape *ps = new circle(); 2.经由virtual function机制 ps->rotate(); 3.经由dynamic_cast和typeid运算符 if(circle* pc = dynamic_cast<circle*>(ps))... 多态的主要用途是经由一个共同的接口来影响类型的封装,这个接口通常被定义在一个抽象的base class中。这个共享接口使以virtual function机制引发的,它可以在执行期根据object的真正类型解析出到底是哪一个函数实体被调用。 8.一个class object的内存表现: ①其non static data members的总和大小; ②加上任何由于alignment的需求而填补(padding)上的空间。 ③加上为了支持virtual而由内部产生的任何额外负担(overhead)。 9.一个指针,不管它指向哪一种数据类型,指针本身所需的内存大小是固定的。 10.一个pointer或一个reference之所以支持多态,是因为它们并不引发内存中任何"与类型有关的内存委托操作",会受到改变的只是它们所指向的内存的"大小和内容解释方式"而已。 11.C++通过class的points和references来支持多态,这种程序设计风格就称为面向对象。
转载请注明原文地址: https://www.6miu.com/read-30137.html

最新回复(0)