1.0 概视
C与C++的差别:
C语言中变量和函数分离,语言本身没有支持“数据和函数”之间的关联性,我们称之为程序性的。C++则是用独立的“抽象数据类型(abstract data type ADT)”来实现,数据和函数都在一个集体里面。
空间成本差别:
成员变量相同的结构体变量和类变量(对象)拥有相同大小的内存空间。虽然类声明中有member function,却不出现在object中,每一个non-inline member function只会产生一个函数实体。至于每一个“拥有零个或一个定义”的inline function则会在其每一个使用者身上产生一个函数实体。C++在布局以及存取时间上主要的额外负担是由virtual引起(后续会提及),包括:
1. virtual function机制: 用以支持一个有效率的“执行期绑定”(runtime binding)
2. virtual base class:用以实现“多次出现在继承体系中”的base class,有一个单一而被共享的实体
出现在object中,每一个non-inline member function只会产生一个函数实体。至于每一个“拥有零个
或一个定义”的inline function则会在其每一个使用者身上产生一个函数实体。C++在布局以及存取时
间上主要的额外负担是由virtual引起(后续会提及),包括:
1. virtual function机制: 用以支持一个有效率的“执行期绑定”(runtime binding)
2. virtual base class:用以实现“多次出现在继承体系中”的base class,有一个单一而被共
享的实体
此外还有一些多重继承下的额外负担,发生在“一个derived class和其第二或后续之base class的转换”
1.1 对象模式
C++中data member类型分为static和nonstatic,member function分为static、nonstatic和virtual
C++对象模型:
nonstatic datamembers被配置于每一个object之内;static data members被存放在所有的class object之外;static和nonstatic function members被存放在所有的class object之外;
virtual table以两个步骤支持:
1.每一个class产生一堆指向virtual functions的指针,这些指针放在一个表格中,这个表格被称作
virtual table(vtbl)
2.在每一个class object中添加一个指针,指向相关的virtual table,这个指针被称作vptr 。
vptr的设定和重置都有每一个class的constructor、destructor和copy assignment运算符启动完成。
另外,每一个class所关联的type_info object(用以支持Runtime type identification,RTTI)也经由virtualtable被指出,通常放在vtbl的第一个slot。
继承相关模型:
C++支持单一继承、多继承和虚继承;
C++采用的继承模型中,base class object的data member被放置在derived class object中,这样提供了对base class members最有效率的存取。缺点也是显而易见的,就是base class中member有所改变,所有用到该base class的derived class全部都需要被编译过。不过我认为相对于直接在运行阶段耗时,不如在编译阶段的耗时来替代。