Inside the C++ Object Model 学习笔记 第三章 Data语义学

这一章,正如书中所说,研究的是class 的data member 以及 class hierarchy。 class 的 data member ,nostatic member 是“个别class object”感兴趣的数据, static member是放置的“整个class”感兴趣的数据。

先看一个例子:书上的

这个的结果是 1 , 4 , 8

然后我们再class A 中加一个数据成员

这个的结果是 4, 8 ,12

这是在我的vs2008的编译器下产生的结果。

empty virtual base class 被看做derived class object 开头的一部分,没有花费任何的额外空间。

至于没有数据成员的class 大小为什么是一,这使得这个class的两个object得以在内存中配置独一无二的地址。

 

开始:

数据成员的绑定

我们来看Data Member 的Binding,现在我们对数据成员的绑定只需要记住一个防御性风格:始终把嵌套类型的声明放在class的开始部分,这样做可以确保非直觉绑定的正确性。看下面的一个例子:

typedef int length; //
class point3d
{
public:
//length被决议成global typedef 也就是int
//_val被决议成Point3d::_val
void mumble(length val){_val=val;}
length mumble(){return _val;}
//……
private:
//length必须在这个class对它的第一个参考操作之前被看见
//这样声明将使先前的参考操作不合法
typedef float length;
length _val;
//……
};

对里边函数的分析将延迟直至class声明的右大括号出现才开始。上边的例子中,length在编译时期会出错。我们该遵守规则。

 

data member的布局以及data member的存取。

布局就是按照其生命顺序,但是这里要注意的是aligement(边界调整)会填补一些bytes, 编译器还会安插一个“内含”的东西,如vptr。

数据成员的存取,static数据成员,不在成员的数据布局之内,不需要通过clas object 获取,二 nostatic member 需要。对于某个调用它的函数,会安插一个this指针来进行数据的存取。

Point3d

Point3d::translate(const Point3d &pt)
{
x+=pt.x;
y+=pt.y;
z+=pt.z;
}

被编译器经过内部转换成为了下面这个样子:

Point3d
Point3d::translate(Point3d *const this,const Point3d &pt)
{
this->x+=pt.x;
this->y+=pt.y;
this->z+=pt.z;
}

如果要对一个非静态的成员变量进行存取,编译器会把类对象的起始地址加上数据成员的偏移量。例如:

Point3d origin;
origin._y=0.0;
//地址&origin._y将等于
&origin+(&Point3d::_y-1);
目的是使编译系统能够区分出以下两种情况:
一个指向数据成员的指针,用来指出类的第一个成员。
一个指向数据成员的指针,没有指出任何成员。

 

下边是比较重要的“继承”给data member 带来的改变。

继承带来的影响就是得益“数据的共享”以及“数据处理方法”的共享、在继承中要注意的就是“base class subobject 在derived class中的原样性”会有一些所谓的填补空间的浪费,但这样做保证了空间上操作的可行性。

还要加上多态,当然这就要加上vptbl 以及 vptr ,而且constructor和destructor 都要改变,都讲过了 因为我这个是倒着写笔记的。你懂的。
未完 待续。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值