zoukankan      html  css  js  c++  java
  • c++对象模型笔记

          这几天翻出了很久前看过的Inside the C++ Object Model,发现很多东西忘记了,这一遍看下去,想把主要的几个对象模型记下来,也算是把书读薄吧。

    1. 简单对象模型(没有虚函数,继承)

    例子:

    class Point {

    public:

    Point(float xval, float yval);

    float x() const;

    float y() const;

    static int PointCount();

    private:

    float _x;

    float _y;

    static int _point_count;

    };

    对象模型:



    2. 有虚函数的

    例子:

    class Point {

    public:

    Point(float xval, float yval);

    virtual ~Point();

    float x() const;

    float y() const;

    static int PointCount();

    protected:

    virtual ostream& print(ostream &os) const;

    private:

    float _x;

    float _y;

    static int _point_count;

    };

    对象模型



    3.没有虚函数的继承

    例子:

    class Point {

    public:

    Point(float xval, float yval);

    float x() const;

    float y() const;

    static int PointCount();

    private:

    float _x;

    float _y;

    char _t;

    static int _point_count;

    };

    class Point3D {

    private:

    float _z;

    public:

    Point3D(float x, float y, float z);

    float z() const;

    };

    对象模型(假定编译器按照8字节对齐,float是4字节的)


    4.含有虚函数的继承

    例子:

    class Point {

    public:

    Point(float xval, float yval);

    virtual ~Point();

    float x() const;

    float y() const;

    static int PointCount();

    protected:

    virtual ostream& print(ostream &os) const;

    private:

    float _x;

    float _y;

    static int _point_count;

    };

    class Point3D {

    private:

    float _z;

    public:

    Point3D(float x, float y, float z);

    float z() const;

    };

    对象模型是:


    -------------------------------------------------------------------华丽的分割线--------------------------------------------------------------------

    * 以上都是假设vptr是在对象地址头部,不同编译器实现不一样,一般有在头部和尾部的不同。

    * 另外虚函数在vtbl的索引一般是第0项是type info,第1项是虚析构函数。vc的实现基本是这样,只不过vptr直接指向第一项了。


    5. 带虚函数的多重继承

    例子:

    class Base1 {

    public:

    Base1();

    virtual ~Base1();

    virutal Base1 *Clone() const;

    protected:

    float _base1_data;

    };

    class Base2 {

    public:

    Base2();

    virtual ~Base2();

    virtual Base2 *Clone() const;

    protected:

    float _base2_data;

    };

    class Derived: public Base1, public Base2 {

    public:

    Derived();

    virtual ~Derived();

    virtual Derived *Clone() const;

    protected:

    float _derived_data;

    }

    对象模型:


    *当使用指向第二个base subobject的指针调用Clone函数的时候,指针必须被调整到执行Derived对象起始地址,而使用指向第一个base subobject的指针去掉用则不会存在这个问题,有一些编译器针对这个问题,做了一些优化,虚函数被包装成一个特殊处理函数放到的的vtbl中,特殊处理一开始先调整this指针,然后才执行真正的代码逻辑。这种优化技术称为thunks,具体描述见http://en.wikipedia.org/wiki/Thunk_(object-oriented_programming)


    概述:

    总的来说,C++对象模型是兼容C的,为了支持多态,又引入了虚函数机制,而所谓的虚函数机制,只是编译器在c语言基础上默默加上了vptr和vtbl,并对用户透明的维护这些值。了解了这些原理,完全可以在纯C的环境模拟编译器干的这些事情。

    TODO:虚拟继承的对象模型

  • 相关阅读:
    浅谈Linux进程
    POJ 1426 Find The Multiple
    JS JavaScript闭包和作用域
    JS JavaScript深拷贝、浅拷贝
    JS JavaScript中的文档碎片 DocumentFragement JS性能优化
    前端DOM知识点
    JS JavaScript中的this
    JS JavaScript实现杨辉三角
    JS JavaScript事件循环机制
    ES6基本语法
  • 原文地址:https://www.cnblogs.com/persistentsnail/p/3294844.html
Copyright © 2011-2022 走看看