C++ 对象模型--1小窥

来源:互联网 发布:nginx php 500错误 编辑:程序博客网 时间:2024/05/16 16:02

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全部都需要被编译过。不过我认为相对于直接在运行阶段耗时,不如在编译阶段的耗时来替代。