CPP Object Model: Introduction
目录

1. 对象的成员

function members:

  • static:不占用对象内存空间
  • non-static:不占用对象内存空间
  • virtual:通过vptr间接占用对象内存空间

data members:

  • static: 在数据段,不占用对象内存空间
  • non-static: 占用对象内存空间

每个class关联的type_info object也通过vtbl的第一个slot指向。

一个class object需要多少内存?

  • non-static data members之和以及其对齐所占字节
  • 支持virtual所产生的额外负担(overhead)

2. virtual机制

CPP相对于C来说额外的内存布局和存取时间主要是virtual机制引起的,包括:

  • virtual function: runtime binding
  • virtual base class: share base object

vptr的设定(setting)和重置(resetting)都由每一个class的contructor, destructor和copy assignment运算符自动完成(编译器完成)。

多态主要用途是经由一个共同的接口来影响类型的封装。 C++以下列方法支持多态:

  1. 编译时多态:class template and function template
  2. 运行时多态:virtual function and virtual base class

多态特殊方式:

  1. 隐式转化操作,基类指针指向派生类对象:shape *ps = new circle()
  2. dynamic_casttypeid运算符:if (circle *pc = dynamic_cast<circle*>(ps)) ...

三种programming paradigms:

  • procedural model:如C那样
  • ADT model(object-based):封装(如string),不使用继承和多态,从而没有vtbl,速度快,对象空间紧凑,设计可能没有弹性。拷贝是值拷贝。
  • OO model(object-oriented):封装、继承、多态。拷贝是引用拷贝。只有通过pointer或reference间接访问对象才能获得OO所需的多态性质。

pointer或reference的类型是静态类型,其指向的object真正类型是动态类型。 一个pointer或reference之所以支持多态,是因为它们并不引发内存中任何“与类型有关(静态类型)的内存委托操作”; 会受到改变的,只有它们所指向的内存的“大小和内容解释方式”(动态类型)而已。

3. 数据成员的内存布局

class中同一access section(public/protected/private)的数据成员按其声明的顺序出现在内存布局中。 不同access section之间的顺序不确定(?)。 base classes和derived classes的数据成员布局先后也不确定。

一个object内存构成:

  • nonstatic data members;
  • 补齐而填补的空间;
  • 支持virtual机制而产生的负担;

Tips

p是指针,(*p).func()也是调用虚函数机制运行时决定,或说这种等价p->func()

发表评论