《深度探索C++对象模型》

对象成员布局

C++对象模型(The C++ object model)

简单对象模型

class Point {
public:
    Point(float xval);
    virtual ~Point();

    float x() const;
    static int PointCount();

protected:
    virtual ostream& print(ostream &os) const;

    float _x;
    static int _point_count;
};

Point实例的内存布局如下:

继承

单一继承: class Book : public Library_entry { ... };

多重继承: class iostream : public istream, public ostream { ... };

虚拟继承, 虚继承的类不管被派生多少次, 永远只会有一个实体subobject class istream : virtual public ios { ... }; class ostream : virtual public ios { ... };

编译器展开(一种可能)

new = malloc + ctor

ctor = 构造函数 + vptr

虚成员函数: 跳转到 p->vptr[n] 执行

非虚成员函数: 直接跳转到对应 func 执行

关键词差异(A keyword distinction)

组合composition的struct(继承时编译器可能添加额外的data member到base struct subobject中), 拥有与C兼容的空间布局.

对象差异(An object distinction)

C++程序设计支持3中设计典范(programming paradigms):

  1. 过程式procedureal model: C
  2. 抽象数据类型abstract data type, ADT: 由“抽象”和一组表达式(public接口)一起提供
  3. 面向对象object-orientated: 通过一个抽象的base class封装起来

内存布局

class ZooAnimal {
public:
  ZooAnimal();
  virtual ~ZooAnimal();

  // ...
  virtual void rotate();

protected:
  int loc;
  string name;
};

ZooAnimal za("Zoey");
ZooAnimal *pza = &za;
  • 多态
class Bear : public ZooAnimal {
public:
  Bear();
  virtual ~Bear();

  // ...
  virtual void rotate();

protected:
  enum Dances { ... };

  Dances dance;
  int block;
};

Bear b("Yogi");
Bear *pb = &b;
Bear &rb = *pb;

本文采用 知识共享署名 4.0 国际许可协议(CC-BY 4.0)进行许可,转载注明来源即可: https://ziqia.github.io/2020/01/28/InsideCPPObject-1-object_model.html。学识粗浅写作仓促,如有错误辛苦评论或 邮件 指出。