美文网首页
C++ 对象模型分析

C++ 对象模型分析

作者: ffusheng | 来源:发表于2017-05-12 22:07 被阅读0次

想写一个系列的文章,分析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++ 虚函数表分析

相关文章

网友评论

      本文标题:C++ 对象模型分析

      本文链接:https://www.haomeiwen.com/subject/biytxxtx.html