C++(day 4)深入探索对象模型——简单对象模型

问题引入

基本认识:在C++中,有两种class data member:static 和 nonstatic ,以及三种class member function:static,nonstatic 和 virtual。

今有一类,声明如下:

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类对象在内存中是如何分布的?

初步探索

初步探索得到了一个简单对象模型,这个模型可能是为了尽量减低C++编译器的设计复杂度而开发出来的,不过不足的是,它赔上了空间和执行期的效率。
class Point 的简单对象模型如图:
简单对象模型
这样的一个对象模型是怎样工作的呢?

  1. 每一个对象object都由一系列的位置slot组成
  2. 每个位置slot存着一个成员指针(point-to-member)
  3. 成员指针pointer-to-member的存放顺序按其声明顺序存放
  4. 成员指针pointer-to-member指向成员member首地址

这样的工作方式有什么样的特点呢?

  1. class object 中存放的不是members 本身,而是指向成员的指针pointer-to-member
  2. 对象需要的存储空间只取决于成员members的数量,和members的类型类型无关。
  3. members是以位置slot中的索引值来寻址的,也就是得到某个member需要先在object中某个slot获得该member的首地址,再根据member的首地址取寻址。
  4. class object 的大小计算:指针大小 × 类所声明的members数目

简单对象模型并没有应用于实际产品上,不过其中关于关于索引和slot数目的观念,倒是被应用到了C++的“指向成员的指针”pointer-to-member观念之中。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值