详细介绍c++中的类对象内存模型
来源:互联网 发布:js中正则表达式的使用 编辑:程序博客网 时间:2024/05/28 20:19
内存模型描述的是程序中各变量(实例域、静态域和数组元素)之间的关系,以及在实际计算机系统中将变量存储到内存和从内存取出变量这样的低层细节.不同平台间的处理器架构将直接影响内存模型的结构.
首先介绍一下C++中有继承关系的类对象内存的布局:
在C++中,如果类中有虚函数,那么它就会有一个虚函数表的指针__vfptr,在类对象最开始的内存数据中。之后是类中的成员变量的内存数据。
对于子类,最开始的内存数据记录着父类对象的拷贝(包括父类虚函数表指针和成员变量)。之后是子类自己的成员变量数据。
对于子类的子类,也是同样的原理。但是无论继承了多少个子类,对象中始终只有一个虚函数表指针。
为了探讨C++类对象的内存布局,先来写几个类和函数
首先写一个基类:
然后,我们多种不同的继承情况来研究子类的内存对象结构。
1. 无虚函数集继承
这个子类Child1没有继承任何一个基类的虚函数,因此它的虚函数表如下图:
我们可以看出,子类的虚函数表中,先存放基类的虚函数,在存放子类自己的虚函数。
2. 有一个虚函数继承
当子类重载了父类的虚函数,则编译器会将子类虚函数表中对应的父类的虚函数替换成子类的函数。
3. 全部虚函数都继承
4. 多重继承
多重继承,即类有多个父类,这种情况下的子类的内存结构和单一继承有所不同。
我们可以看到,当子类继承了多个父类,那么子类的内存结构是这样的:
子类的内存中,顺序
5. 菱形继承
6. 单一虚拟继承
虚拟继承的子类的内存结构,和普通继承完全不同。虚拟继承的子类,有单独的虚函数表, 另外也单独保存一份父类的虚函数表,两部分之间用一个四个字节的0x00000000来作为分界。子类的内存中,首先是自己的虚函数表,然后是子类的数据成员,然后是0x0,之后就是父类的虚函数表,之后是父类的数据成员。
如果子类没有自己的虚函数,那么子类就不会有虚函数表,但是子类数据和父类数据之间,还是需要0x0来间隔。
因此,在虚拟继承中,子类和父类的数据,是完全间隔的,先存放子类自己的虚函数表和数据,中间以0x分界,最后保存父类的虚函数和数据。如果子类重载了父类的虚函数,那么则将子类内存中父类虚函数表的相应函数替换。
7. 菱形虚拟继承
结论:
(1)对于基类,如果有虚函数,那么先存放虚函数表指针,然后存放自己的数据成员;如果没有虚函数,那么直接存放数据成员。
(2)对于单一继承的类对象,先存放父类的数据拷贝(包括虚函数表指针),然后是本类的数据。
(3)虚函数表中,先存放父类的虚函数,再存放子类的虚函数
(4)如果重载了父类的某些虚函数,那么新的虚函数将虚函数表中父类的这些虚函数覆盖。
(5)对于多重继承,先存放第一个父类的数据拷贝,在存放第二个父类的数据拷贝,一次类推,最后存放自己的数据成员。其中每一个父类拷贝都包含一个虚函数表指针。如果子类重载了某个父类的某个虚函数,那么该将该父类虚函数表的函数覆盖。另外,子类自己的虚函数,存储于第一个父类的虚函数表后边部分。
(6)当对象的虚函数被调用是,编译器去查询对象的虚函数表,找到该函数,然后调用。
到这c++类对象的内存模型就介绍完了,希望对大家有帮助。
- 详细介绍c++中的类对象内存模型
- 详细介绍c++中的类对象内存模型
- 详细介绍c++中的类对象内存模型
- 详细介绍c++中的类对象内存模型
- 详细介绍C++中的类对象内存模型
- c++内存对象模型(非常详细)
- C语言中的内存模型
- 详细研究java内存中的对象
- 【C++】C++对象内存模型简介
- 漫谈C++:对象内存模型分析
- C++-对象继承内存模型配图
- 类、对象的内存模型
- C++类对象内存模型
- C++类内存对象模型
- dom 节点(文档对象模型)详细介绍
- C语言中的内存地址分配模型
- C 中的 time 相关函数详细介绍
- 【C++】浅析C++中的对象模型
- 《數字圖像處理基礎》第6章 圖像的銳化處理 要點歸納
- 控制台或Winform程序中如何编码或解码Server.URLEncode
- string类的实现(实现了一部分功能)
- SQL SERVER 与ACCESS、EXCEL的数据转换
- shell--sed
- 详细介绍c++中的类对象内存模型
- windows下编程控制摄像头的详细介绍
- 《數字圖像處理基礎》第5章 圖像噪聲的抑制 要點歸納
- 指针(二)
- 全国各地车牌查询表
- 对话框和控件的背景和颜色定制
- VB工程--百例81--字体演示
- Asp.Net复杂表格:应用 Repeater 创建复杂表头的表格
- 噪聲與濾波