C++对象模型
本书使用 Point 类作为示例来解释对象模型的样子。 类定义如下:
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;
};
其对象模型如下:
C++模型
每个类首先会用一个表来存储每个虚函数的指针,而每个类中实际存储的就是一个指向该表的指针。
书中给出了一个例子。 类 X 有一个副本、a 和 foo()。 下面展示了其使用对象模型的转换过程:
X foobar() {
X xx; // _result.X::X();
X* px = new X; // px = _new(sizeof(X)); if (px != 0) px->X::X();
xx.foo(); // foo (&_result);
px->foo(); // (*px->vtbl[2])(px);
delete px; // if (px != 0) { (*px->vtbl[1](px); _delete(px); }
return xx; // return _result;
}
其中,vtbl[0]存储X::~X(),vtbl[1]存储X::foo()。
关键字差异关键字的目的是为了方便C程序员向C++部落迁移。
在 C++ 中合理使用 C 是当您想要将“复杂类的全部或部分”传递给 C 函数时。 声明可以封装数据并保证与C兼容的空间布局。仅以组合形式存在,注意不包括继承。对象的区别
要计算一个类占用了多少内存,一般来说,需要考虑: