深度探索C++对象模型 关于对象的笔记

来源:互联网 发布:数据调查公司 编辑:程序博客网 时间:2024/05/16 05:28

简单对象模型(Simple Object Model)   

    三个data members直接包含在每一个class object之中,就像C struct的情况一样。而member function 虽然含在class的声明之内,却不出现在object之中。每一个non-inline member function只会诞生一个函数实体。至于每一个“拥有零个或一个定义”的inline function则会在其每一个使用者(模块)身上产生一个函数实体。你即将看到:C++在布局以及存取时间上主要的额外负担是由virtual引起。包括:

    virtual function: 用以支持一个有效率的“执行其绑定”。

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

    实际上,类中的成员函数并不存放在”类的对象“中,而只有”指向成员函数的指针“才放在对象中。这么做可以避免“members有不同的类型,因而需要不同的存储空间”所导致的问题。

表格驱动对象模型(A Table-driven Object Model) 

    这种模型把所有与成员函数相关的信息抽取出来,放在一个data member table和一个member function table之中,类本身只包含指向这两个表格的指针。 

    虽然这个模型也没有实际应用于真正的C++编译器身上,但member function table 这个观念却成为支持virtual functions的一个有效方案。

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

    在这个模型中,数据成员被放置在每一个”类的实例“之中。而静态数据成员则被存放在所有的”类的实例“之外。静态和非静态的成员函数也被放在所有的”类的实例“之外。虚拟函数则以两个步骤支持之:

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

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

 

    一个派生类如何在本质上模塑其基类呢?在“简单对象模型”中,每一个基类可以被派生类对象的一个slot指出,该slot包含基类子对象的地址。这个体制的主要缺点是,因为间接性而导致空间和存取时间上的额外负担,优点则是类对象的大小不会因为基类的改变而受影响。

    “指针类型”会教导编译器如何解释某个特定地址中的内存内容及其大小。

    但是一个void*的指针,将涵盖怎样的地址呢?我们不知道!所以,我们不能够通过一个类型为void*的指针访问数据。所以,转型(cast)其实是一个编译器指令。大部分情况下它并不改变一个指针所含的真正地址,它只影响“被指出之内存的大小和其内容”的解释方式。

    C++通过指针和引用来支持多态。这是因为它们并不引发内存中任何“与类型有关的内存委托操作”;会受到改变的只是它们所指向内存的“大小和内容解释方式”而已。如果是对象的话,派生类赋值给基类,则派生类的东西将会被切割,只保留与基类相关的东西。

   

    

    

    

    


    

    

  

    

原创粉丝点击