C语言中,“数据”和“处理数据的操作”十分开来的。由一组“分布在各个一功能味道想得函数中”的算法所驱动,他们处理的是共同的外部数据。而在C++中,则使用的是独立的“抽象数据类型abstract data type(ADT)”所驱动。从软件工程的角度看“一个ADT或CLASS hierar5chy的数据封装”比"在C程序中程序迎的使用全局数据好"。
加上封装后的布局成本
C++在布局以及存取时间上的额外负担是由Virtual引起,包括:
Virtual function 机制 用以支持一个有效率的执行期绑定"runtime bingding"
Virtual base class 用以实现“多次出现在继承体系中的baseclass,有一个单一而被共享的实体”
1.1 C++ 对象模型 (the c++ object model)
在C++中,有两种class data members : static and nonstatic; 三种class member function :static , nonstatic and virtual。
而这些内容的安排方法有:
1 简单对象模型
为了尽量减低C++编译器的设计复杂度,配上了空间和执行期的效率。一个object 是一系列的slots,每一个slot之想一个member : data member and function slot. 每个data member and function member都有自己的slot. 此模型中,meember 不放在object中,而是存放slot,由slot指向member.
2 表格驱动对象模型
此模型中将data member放在一个表中,member function放在一个表中,而class object 本身还有两个表哥的指针.表中的每一个单格存放data member 和member function。
3 C++ 对象模型
Nonstatic data members 北方旨在没一个class object中,static data members 放在class object 之外,而static and nonstatic function memebers 放在所有的class object 之外。而Virtual functions一两个步骤完成: 1) 每一个class 产生出一对之想virtual functions的指针,放在virtual table中 2)每一个class object 添加一个指针,指向相关的virtual table. 而VPTR的设定和重置是由constructor ,destructor ,copy constructor完成的。而每一个class 索关联的type_infor也是由virtual table完成的,存放在表格的第一个slot中。
优点:空间和存取时间的效率; 缺点: 如果应用程序代码本身未曾改变,但是用到的class objects的nonstatic data members有所修改,那么哪些应用程序代码都需要重新编译。
加上继承:
1)简单模型:每一个base class可以被derived class object内的一个slot指出,该slot内涵base class subobject的地址。 缺点:间接性导致了空间和存取时间上的负担, 优点: class object的大小不因base class 而受影响。
2)Base Table 模型。base class table产生出来,表格中的每一个slot内含一个相关的base class地址,很想virtual table内涵一个virtuabl funciton 地址。每个对象含有一个BPTR,指向base class table. 缺点:由于间接性导致了空间和存取时间上的额外负担 优点:每个class object对于继承都有一直的表现方式: 每个class object 都应该在一个固定的位置上安放一个base table指针,与base classes的大小和树木无关,而且不改变class objects的本身的大小。
3) C++的模型: base class subject的data members直接放在derived class object中,提高了存取的效率,却电视每个base class data member改变一下,derived class 就改变了 需要重新编译。而Virtual base class的产生,需要一个间接的base class的表现方法,参看3.4
对象模型如何影响程序:不同的对象模型,会导致现有的程序代码必须修改以及必须加入新的程序代码两种结果。
1.2 关键词所带来的差异
为了支持8种整数的运算,所以C++支持了运算符重载。在C++中,必须保证同一个access section内的数据,以其申明的次序出现在内存布局中,而不同的access sections的存放次序是不定的。同样,base class 和derived class的布局次序也是没有规定的。
1.3 对象的差异
C++支持的三种programming paradigms:
1)程序模型:类似于C语言 2)抽象数据类型模型:一组抽象的数据和它的相应表达式 3)面向对象模型:彼此相关的类型,通过一个抽象的base class被封装起来。
C++一下列的方法支持多态:
1)经由异族硬汉的转化操作,将derived class object的地址赋给base class pointer : shapre *ps = new circle();
2)经由virtual function机制: ps->ritate();
3)经由dynamic_case 和 typeid运算符: if (circle * pc= dynamic_case <circle *> (ps) ) ...
需要多少的内存才能表现一个class object: 1) 其nonstatic data members的大小 2)alignment的需求 3) Virtual funciton and Virtual base class的额外负担
指针的类型:每个指针的大小是一样的,但是有“指向不同类型之各指针“间的区别,每个指针只能覆盖其指向对象的内存范围。