虚函数占用类空间大小(转)
来源:互联网 发布:网络麻将制作平台 编辑:程序博客网 时间:2024/06/07 05:06
总结一下VPTR 和 VTABLE 和类对象的关系:
每一个具有虚函数的类都有一个虚函数表VTABLE,里面按在类中声明的虚函数的顺序存放着虚函数的地址,这个虚函数表VTABLE是这个类的所有对象所共有的,也就是说无论用户声明了多少个类对象,但是这个VTABLE虚函数表只有一个。
在每个具有虚函数的类的对象里面都有一个VPTR虚函数指针,这个指针指向VTABLE的首地址,每个类的对象都有这么一种指针。
2、虚继承
这个是比较不好理解的,对于虚继承,若派生类有自己的虚函数,则它本身需要有一个虚指针,指向自己的虚表。另外,派生类虚继承父类时,首先要通过加入一个虚指针来指向父类,因此有可能会有两个虚指针。
二、(虚)继承类的内存占用大小
首先,平时所声明的类只是一种类型定义,它本身是没有大小可言的。 因此,如果用sizeof运算符对一个类型名操作,那得到的是具有该类型实体的大小。
计算一个类对象的大小时的规律:
1、空类、单一继承的空类、多重继承的空类所占空间大小为:1(字节,下同);
2、一个类中,虚函数本身、成员函数(包括静态与非静态)和静态数据成员都是不占用类对象的存储空间的;
3、因此一个对象的大小≥所有非静态成员大小的总和;
4、当类中声明了虚函数(不管是1个还是多个),那么在实例化对象时,编译器会自动在对象里安插一个指针vPtr指向虚函数表VTable;
5、虚承继的情况:由于涉及到虚函数表和虚基表,会同时增加一个(多重虚继承下对应多个)vfPtr指针指向虚函数表vfTable和一个vbPtr指针指向虚基表vbTable,这两者所占的空间大小为:8(或8乘以多继承时父类的个数);
6、在考虑以上内容所占空间的大小时,还要注意编译器下的“补齐”padding的影响,即编译器会插入多余的字节补齐;
7、类对象的大小=各非静态数据成员(包括父类的非静态数据成员但都不包括所有的成员函数)的总和+ vfptr指针(多继承下可能不止一个)+vbptr指针(多继承下可能不止一个)+编译器额外增加的字节。
- 虚函数占用类空间大小(转)
- 虚函数 类空间占用大小
- 虚函数占用大小Sizeof
- MySQL查看表占用空间大小 [转]
- MySQL查看表占用空间大小(转)
- 类的大小,占用字节,空间。
- sql占用空间大小
- 虚函数空间大小
- 虚函数工作原理 与 (继承中)对象占用空间大小
- 各种数据类型占用空间大小
- 获取文件占用空间大小
- C++中虚函数工作原理和(虚)继承类的内存占用大小计算
- C++中虚函数工作原理和(虚)继承类的内存占用大小计算
- Oracle各种空间大小及占用大小
- 文件大小与占用空间大小(附带字节转KB,MB公式)
- 查询数据库中所有表占用空间的大小【转 】
- MAC 命令行 查看硬盘和文件夹大小(占用空间)
- 查看表空间大小以及已占用空间大小
- cigarettes
- SQL Plan Management (2)
- 利用 TensorFlow 高级 API Keras 实现 MLP,CNN,LSTM
- 细谈Hibernate之悲观锁和乐观锁解决hibernate并发
- cpu版本的tensorflow(通过anaconda环境)安装
- 虚函数占用类空间大小(转)
- nuget push XXX.1.0.0.0.nupkg 出现403错误(Failed to process request)
- Redis-cli 连接
- 安全人工智能应用之我见:时代“风口”的交叉点
- JSON的方法及数据绑定
- react 资源网址
- webstorm工具使用的快捷键
- 我心中的未来购物中心
- mybatis 关于 like %% 查询 mysql oracle sqlserver 数据库