C++对象模型

C++中的成员:

  成员变量:静态变量、非静态变量

  成员函数:静态函数、非静态函数、虚函数

 

1. 简单对象模型

  对象中只存放指向成员的指针,这么做可以避免成员不同类型,不同存储空间的尴尬;

  对象所占内存大小为指针大小 * 成员数量(成员函数 + 成员变量)。

 

2. 表格驱动对象模型

  对象本身只有两个指向表格的指针,成员变量表和成员函数表;

  成员变量表直接存储变量本身;

  成员函数表存储函数指针;

  这种理念是虚函数表的雏形。

 

3. C++对象模型

  C++对象模型是从简单对象模型派生而来的,并对内存空间和存取时间做了优化;

  对象本身只有变量和一个虚指针;

  虚指针(vptr)指向虚函数表(vtbl);

变量:只有非静态成员变量存储在对象内存中,其他静态成员变量和所有成员函数(包括静态和非静态的)都在对象内存之外。

注意:C++对象的第一个字节为虚指针;虚函数表中的前面的指针为虚函数指针,最后才是指向type_info对象的指针。

 

C++类成员函数

从内存布局上看,内存布局中只有成员变量的空间,并没有成员函数的内存空间。

当我们在一个类中声明一个成员函数时,编译器隐藏了第一个参数,实际上成员函数储存在代码区:

void memberFunc(Object* this, int arg1, int arg2);

  

并且这个函数参数this只有接收所属类类型指针时才能调用。

所谓的 .运算符或者->运算符,实际是把this指针传递给函数,调用时长这个样子:

void memberFunc(this, this->arg1, this->arg2);

  

C++对象模型优缺点

优点:相对于简单模型的通过指针间接访问数据的思想,C++模型提高了访问数据的效率,并参考表格驱动理念设计了虚函数表,节约了对象空间。

缺点:修改对象的非静态成员变量(增删改),用到此对象的代码就需要重新编译。

posted @ 2021-08-29 21:37  默行于世  阅读(107)  评论(0编辑  收藏  举报