在做面向对象编程的时候,我总是想知道,成员变量存放在哪里,成员函数存放在内存的哪里,变量又存放在哪里? 它们都在声明中吗? 通过阅读《深入探究C++对象模型》,你可以找到这类问题的答案。
C++的设计者提出了从简单到复杂的几种对象模型。 我在这里一一介绍一下:
简单对象模型
第一个模型非常简单。 它最大限度地降低了C++编译器的设计复杂性,但牺牲了空间和执行效率。 在这个简单的模型中,一个槽是一系列槽,每个槽指向一个槽。 根据声明的顺序,为每个分配一个槽位。 每个数据都有自己的槽。 下图说明了该模型:
在这个简单的模型中,其本身不包括在内。 里面只放置了“指向”的指针。 这样做可以避免不同类型需要不同存储空间的问题。 由时隙的索引值寻址。 在这个例子中, _x 的索引是 6, 的索引是 7。类的大小很容易计算:“指针的大小,乘以类中声明的数字”就是这样。
虽然这个模型还没有应用到实际产品中,但是索引或者槽号的概念已经应用到了C++的“指向成员的指针”(-to-)概念中。
表驱动的对象模型
为了让一切都有一致的表达,另一种对象模型是提取所有相关信息并将其放入数据表和表格中。 该类本身包含指向这两个表的指针。 。 该表是一系列槽位,每个槽位指向一个; 数据表直接保存数据本身,如下图:
虽然这个模型还没有真正应用到真正的C++编译器中,但是表的概念已经成为支持的有效解决方案。
C++对象模型
著名的 C++ 程序员最初设计(并且仍然主导)C++ 对象模型是从简单对象模型派生出来的,并针对内存空间和访问时间进行了优化。 在此模型中,数据在每个类内配置,数据存储在各个类外部。 并且也被安排在个别班级之外。 这通过两个步骤得到支持:
1、每个类都会生成一堆指针,放到一个表中。 该表称为表(vtbl)。
2.为每个类分配一个指向相关表的指针。 通常这个指针被称为vptr。 vptr 的 set() 和 Reset() 由每个类的 和 复制操作符自动完成(我将在第 5 章中讨论这个问题)。 与每个类相关的信息(支持类型,RTTI)也通过表指出,通常放置在表的第一个槽中。 这最后一个模型不正是我们现在大多数书籍中提到的模型吗?