C++ 对象模型分析

想写一个系列的文章,分析C++对象模型。从整体到局部data和function。
这是第一篇整体描述C++对象模型。

在C++中, 有2种class member: staticnonstatic,以及class member functions: staticnonstaticvirtual

// class Point声明
class Point{
    public:
        Point(float xval);
        virtual ~Point();              // virtual
        float x() const;
        static int PointCount();    // static function
    protected:
        virtual ostream& print(ostram &os) const;  // virtual
        float _x;
        static int _point_count;  // static data
};
简单对象模型

在这个简单模型中, 一个Object 是一系列的slots, 每一个slots按其声明顺序指向一个members. 可以尽量减低C++ 编译器设计复杂度. 同时这样设计可以避免"因为不同members类型, 需要不同存储空间"导致的问题, 但赔上的却是空间和执行器效率.如图所示:


1.jpg
表格驱动模型

为了对所有的classes的所有objects都有一致的表达方式, 另一种设计是把所有与members相关的信息抽离出来, 放在一个data member table中和一个member function table中. 而每一个class object则内含指向这2个表格的指针. Member function table 是一系列的slot(如同简单对象模型), 每一个slot指向一个member function, Data member table则直接持有data本身.如图所示:

2.jpg

C++ 对象模型

C++ 对象模型是从简单对象模型派生而来,并对内存空间和存取时间做了优化。
Nonstatic data members 被配置于每一个class object之内,static data members 则被存放在个别的class
virtual function 以2个步骤支持

  • 每一个class产生出一堆指向virtual function的指针, 放在表格之中, 这个表格即为virtual table(vtbl)。
  • 每一个class object安插一个指针,指向相关的virtual table,这个指针即为vptr。vptr的设定和重置都由每一个class的constructor,destructor,copy assignment运算符自动完成。如图所示:
    3.jpg

    关于vptr和vptl,可见我的另一篇文章C++ 虚函数表分析
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容