《深度探索C++对象模型》系列之(一)

来源:互联网 发布:合金装备知乎 编辑:程序博客网 时间:2024/06/05 06:31

最近在看《深度探索C++对象模型》,不得不说这是一本好书,一本难得的好书,对C++的内在进行了详细的说明,让我读起来,一发不可收拾;最后,发自内心的感叹,真的是一本好书,一本学习C++的必读之作。

从这篇博文开始,我将把自己读《深度探索C++对象模型》时的感悟,以博文的形式和大家进行分享;由于《深度探索C++对象模型》写的有深度,有的地方我也可能理解不到位,希望大家拍砖。

引用书中的话,C++老手分成两种:一种是把语言用的熟烂的;另一种人不但如此,还对于台面下的机制有莫大的兴趣。当然了,我在正往另一种人的地步发展,希望自己走的好。

C++对象模型

在C++中,有两种class data members:static和nonstatic,以及三种class member functions: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;};
在实际生产中,遇到一个复杂的类,如果能看出这个类的内存模型结构,那么以后的操作基本就没有难度的;所以说,学会分析一个类的内存模型,是每一个C++程序员必须要会的知识。在C++对象模型中,非静态数据成员被配置在每一个class object之内,静态数据成员则被存在个别的class object之外,静态和非静态也被放在个别的class object之外。而虚拟函数的实现则不同。

虚拟函数的实现

1.每一个class产生一堆指向虚函数的指针,放在表格之中,这个表格被称为virtual table(vtbl);

2.每一个class object被安插一个指针,指向相关的virtual table。这个指针通常被称为vptr。vptr的设定和重置都由每一个类的构造函数、析构函数和赋值操作符重载函数自动完成。每一个类所关联的type_info object也经由virtual table被指出来,通常放在表格的第一个slot。

如上图所示,就是上述类的C++对象模型。


原创粉丝点击