深度探索C++对象模型读书笔记 三

深度探索C++对象模型读书笔记 三
C++深度探索<三>
1.空的class是1个字节 大家看一下这个程序:
#include
using namespace std;

class Demo
{

};
int main()
{
Demo do;
cout<<“sizeof(Demo):”<<sizeof(Demo)<<endl;
return 0;
}

result:
sizeof(Demo):1
在C++中空类会占一个字节,这是为了让对象的实例能够相互区别。具体来说,空类同样可以被实例化,并且每个实例在内存中都有独一无二的地址,因此,编译器会给空类隐含加上一个字节,这样空类实例化之后就会拥有独一无二的内存地址。如果没有这一个字节的占位,那么空类就无所谓实例化了,因为实例化的过程就是在内存中分配一块地址。
我们再看一个例子:
#include
using namespace std;

class Dest
{

};
class Device:public Dest
{
public:
int a;
};
int main()
{
cout<<“sizeof(Dest):”<<sizeof(Dest)<<endl;
cout<<“sizeof(Device):”<<sizeof(Device)<<endl;
return 0;
}
result:
sizeof(Dest):1
sizeof(Device):4
大部分编译器对于sizeof(derive)的结果是4,而不是8。这就是所谓的空白基类最优化在(empty base optimization-EBO 或 empty base classopimization-EBCO)。在空基类被继承后由于没有任何数据成员,所以子类优化掉基类所占的1 byte。
2.static data member (静态成员变量) 在《深入探索C++对象模型》中,有这么一段话可以思考一下:
static data member 是被编译器提出与class之外,被视为global变量(但只有在class生命范围之内可见),每一个member的存取以及class的关联,不会导致任何空间上或者是执行时间上的额外负担。

每一个static data member只有一个实体,存放在程序data segment中,每次取用static member,就会被内部转化成对该唯一的extern实体的直接参考。
static变量大家都很熟悉了,就不做过多的的阐述了,有上面这段话,会更好理解一些。
3.C++对象模型中的问题
提出这么问题:
point3d origin;
origin.x = 0.0;

point3d *pt = &origin;
pt->x = 0.0
这两种存取的差异。其实,大家也都知道,一种是利用对象访问成员数据,另外一种是用指针来访问数据。其实,C++对象模型中想要说明的是:假设point3d是一个子类,继承与虚基类的成员函数,此时pt就不知道指向哪个类型了,需要等到执行期间才知道。但是origin是可以的,即使继承与虚基类,但是数据成员在编译期就固定了,数据成员的偏移也就确定了。
4.继承的空间布局 看一下这段代码:
#include
using namespace std;

class Dest
{
public:
//constructor(s)
//operations
//access functions
private:
float x,y;
};
class Device:public Dest
{
public:
float z;
};
int main()
{
cout<<“sizeof(Dest):”<<sizeof(Dest)<<endl;
cout<<“sizeof(Device):”<<sizeof(Device)<<endl;
return 0;
}
result:
sizeof(Dest):8
sizeof(Device):12
从这个结果,我们便可以推断出他们的空间布局:
在这里插入图片描述
在这里插入图片描述
其实,在继承的空间布局,其实就是简化了公用的代码,并且减少了内存的占用
多重继承的时候,互相赋值引用对象的时候会出现数据覆盖等不容易控制的现象发生。所以引入了多态的概念。 至于多态,我个人的博客和公众号也有相关的文章,后续会写一篇更完整的分享出来。


欢迎关注公众号:CPP后台开发工程师

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值