1、简单对象模型
整个对象模型被分成很多个槽,每个放置一个成员的指针,或者是数据成员,或者是函数成员。
成员的寻址方式是以第个槽的索引值来寻找,也就是说地址是对象的基址加上索引*指针大小。
2、表格对象模型
将数据成员和函数成员划分开来,数据成员集中放在一个表中,函数成员放在另一个表中。
数据成员表存放实际数据,函数成员表中存放函数地址指针。
3、C++对象模型
(1)
将非静态数据成员作为一类放在类对象中。
所有静态数据成员和函数成员分别放在所有类对象之外;数据成员单独存放,函数成员指针统一放在一个表中,
静态数据成员和函数成员不为每个类对象保存一份拷贝,而是为所有的该类对象共用。
(2)
这样,每个类产生很多指向VIRTUALFUNCTIONS的指针,放在表格之内,这个放着很多函数指针的表格被称为VTBL(virtualtable),而这个指针称为vptr,这个指针的设定和重置由类的构造、析构和拷贝赋值运算符自动完成,注意是自动完成,不用为此专门增加代码。非静态数据成员也放在类对象存储空间之外。
类对象空间里存放2样东西,一个是非静态数据成员(不是数据成员指针),一个就是VTBL的地址。
整个对象模型被分成很多个槽,每个放置一个成员的指针,或者是数据成员,或者是函数成员。
成员的寻址方式是以第个槽的索引值来寻找,也就是说地址是对象的基址加上索引*指针大小。
2、表格对象模型
将数据成员和函数成员划分开来,数据成员集中放在一个表中,函数成员放在另一个表中。
数据成员表存放实际数据,函数成员表中存放函数地址指针。
3、C++对象模型
(1)
将非静态数据成员作为一类放在类对象中。
所有静态数据成员和函数成员分别放在所有类对象之外;数据成员单独存放,函数成员指针统一放在一个表中,
静态数据成员和函数成员不为每个类对象保存一份拷贝,而是为所有的该类对象共用。
(2)
这样,每个类产生很多指向VIRTUALFUNCTIONS的指针,放在表格之内,这个放着很多函数指针的表格被称为VTBL(virtualtable),而这个指针称为vptr,这个指针的设定和重置由类的构造、析构和拷贝赋值运算符自动完成,注意是自动完成,不用为此专门增加代码。非静态数据成员也放在类对象存储空间之外。
类对象空间里存放2样东西,一个是非静态数据成员(不是数据成员指针),一个就是VTBL的地址。