C++中对象的内存分布
来源:互联网 发布:生死疲劳 知乎 编辑:程序博客网 时间:2024/06/05 21:49
C++11类的内存分布:
目的:辅助了解 C++面向的对象的继承和多态。
实验平台:win10+vs2013
首先是创建一个win32的C++项目,右键->属性,C++选项,命令,添加一条命令:
/d1reportAllClassLayout 查看所有相关类的内存分布;
/d2reportSingleClassLayoutXXX(XXX为类名)
查看指定类XXX的内存分布。
在vs编译器中,可以看到:
类对象的内存分布中,
如果类中包含虚函数
1.虚表指针放在对象内存偏移0处
2.成员变量根据在类中的声明顺序依次排列。
3.成员函数不占用内存。
4.静态数据成员也不占用对象的内存。
5.如果是子类,先排布基类成员,然后再排列子类的数据成员。
在虚继承的情况下,会产生2个vfptr指针和1个vbptr指针。
第一个vfptr指针指向子类的虚表
第二个vfptr指针指向虚基类的虚表
vbptr指针的作用就是 子类虚表指针和虚基类虚表指针的衔接指针。
为什么需要虚继承?因为C++多继承中,若果不虚继承,基类内部定义的内容会有2份,这样在子类的子类调用基类的函数或者变量时会出现无法明确内容的错误,在编译时就会提示错误。
虚继承也是为共享基类给子类对象使用。
虚继承的作用是减少了基类的重复,代价是增加了虚表指针的负担,就是非虚继承,也会增加虚表指针的负担。
每个包含虚函数的类都有虚表指针和虚表;
如果不是虚继承,子类将父类的虚表指针继承下来,并且指向自身的虚表(在构造子类对象时);
子类里面有多少个虚函数,虚表里面就有多少个虚函数项。多重继承时,会有多份基类的虚表和虚指针。
若果是虚继承,子类会有两份指针,一份指向自己的虚表,一份指向虚基类。多重继承时虚基表和虚基表指针只有一份。
- C++中对象的内存分布
- C 的内存分布
- c++对象内存中分布
- C语言中内存分布
- 多重继承及虚继承中对象内存的分布
- C++对象中数据成员的内存分布
- 多重继承及虚继承中对象内存的分布
- 多重继承及虚继承中对象内存的分布
- 多重继承及虚继承中对象内存的分布
- C++虚拟继承中对象内存的分布
- 多重继承及虚继承中对象内存的分布
- 多重继承及虚继承中对象内存的分布
- C/C++的内存分布
- c程序的内存分布
- C程序的内存分布
- C程序映像中内存的空间分布
- 【操作系统】Linux中C程序的内存分布情况
- C语言中动态内存分布
- 第十四周项目二——成绩处理函数版
- 程序员常用的快捷操作
- java jxl利用反射将数据库数据导入到Excel
- spring自带的定时任务功能,基于注解和xml配置
- win7开机启动项设置
- C++中对象的内存分布
- 杭电1695GCD【欧拉函数】【容斥定理】
- smail语法 详解
- Redis基础学习--安装、简介、基本数据类型及相应命令
- Hibernate一级缓存——Session
- 关于OnPaint函数的工作原理(很详细,很实用)
- 【leetcode】Linked List —— easy(java)
- 【01】 windows 下搭建Perl 开发环境
- 灵活而奇特的C++语言特性——作用域解析(二)