C++中类对象所占空间的大小
2014-09-01 21:16
267 查看
首先,平时所声明的类只是一种类型定义,它本身是没有大小可言的。 因此,如果用sizeof运算符对一个类型名操作,那得到的是具有该类型实体的大小。
计算一个类对象的大小时的规律:
空类、单一继承的空类、多重继承的空类所占空间大小为:1(字节,下同);
一个类中,虚函数本身、成员函数(包括静态与非静态)和静态数据成员都是不占用类对象的存储空间的;
因此一个对象的大小≥所有非静态成员大小的总和;
当类中声明了虚函数(不管是1个还是多个),那么在实例化对象时,编译器会自动在对象里安插一个指针vPtr指向虚函数表VTable;
虚承继的情况:由于涉及到虚函数表和虚基表,会同时增加一个(多重虚继承下对应多个)vfPtr指针指向虚函数表vfTable和一个vbPtr指针指向虚基表vbTable,这两者所占的空间大小为:8(或8乘以多继承时父类的个数);
在考虑以上内容所占空间的大小时,还要注意编译器下的“补齐”padding的影响,即编译器会插入多余的字节补齐;
类对象的大小=各非静态数据成员(包括父类的非静态数据成员但都不包括所有的成员函数)的总和+ vfptr指针(多继承下可能不止一个)+vbptr指针(多继承下可能不止一个)+编译器额外增加的字节。
首先,平时所声明的类只是一种类型定义,它本身是没有大小可言的。 因此,如果用sizeof运算符对一个类型名操作,那得到的是具有该类型实体的大小。
计算一个类对象的大小时的规律:
空类、单一继承的空类、多重继承的空类所占空间大小为:1(字节,下同);
一个类中,虚函数本身、成员函数(包括静态与非静态)和静态数据成员都是不占用类对象的存储空间的;
因此一个对象的大小≥所有非静态成员大小的总和;
当类中声明了虚函数(不管是1个还是多个),那么在实例化对象时,编译器会自动在对象里安插一个指针vPtr指向虚函数表VTable;
虚承继的情况:由于涉及到虚函数表和虚基表,会同时增加一个(多重虚继承下对应多个)vfPtr指针指向虚函数表vfTable和一个vbPtr指针指向虚基表vbTable,这两者所占的空间大小为:8(或8乘以多继承时父类的个数);
在考虑以上内容所占空间的大小时,还要注意编译器下的“补齐”padding的影响,即编译器会插入多余的字节补齐;
类对象的大小=各非静态数据成员(包括父类的非静态数据成员但都不包括所有的成员函数)的总和+ vfptr指针(多继承下可能不止一个)+vbptr指针(多继承下可能不止一个)+编译器额外增加的字节。
相关文章推荐
- C++基础之--------虚拟继承的类对象的空间大小
- C++中一个类对象占用的内存空间大小
- C++中类对象所占空间的大小
- C++中类对象所占空间的大小
- C++中一个类对象占用的内存空间大小
- C++中类对象所占空间的大小
- C++中 没有数据成员的类的对象所占的内存空间大小问题
- 使用计算总内存大小的方法确定jvm中为对象分配的存储空间大小
- 思路:C++数组大小的计算可以根据所占空间的大小。
- c++的类中,声明一个对象好还是用指针申请一块空间好?
- struct对象在内存中所占的空间大小(内存对齐)
- 一个类的实例化对象所占空间的大小
- c++对象大小
- Oracle 表空间利用率及对象大小查询
- C++中分析对象的存储空间
- C++中对象大小的问题
- Java对象占用内存空间的大小
- ORACLE查看数据库表空间存储对象的大小
- c++一些数据结构占用空间大小的判断
- 一个类的实例化对象所占空间的大小?