C++中类对象所占空间的大小
2012-07-14 09:40
274 查看
C++中类对象所占空间的大小
/article/5415990.html首先,平时所声明的类只是一种类型定义,它本身是没有大小可言的。 因此,如果用sizeof运算符对一个类型名操作,那得到的是具有该类型实体的大小。
计算一个类对象的大小时的规律:
空类、单一继承的空类、多重继承的空类所占空间大小为:1(字节,下同);
一个类中,虚函数本身、成员函数(包括静态与非静态)和静态数据成员都是不占用类对象的存储空间的;
因此一个对象的大小≥所有非静态成员大小的总和;
当类中声明了虚函数(不管是1个还是多个),那么在实例化对象时,编译器会自动在对象里安插一个指针vPtr指向虚函数表VTable;
虚承继的情况:由于涉及到虚函数表和虚基表,会同时增加一个(多重虚继承下对应多个)vfPtr指针指向虚函数表vfTable和一个vbPtr指针指向虚基表vbTable,这两者所占的空间大小为:8(或8乘以多继承时父类的个数);
在考虑以上内容所占空间的大小时,还要注意编译器下的“补齐”padding的影响,即编译器会插入多余的字节补齐;
类对象的大小=各非静态数据成员(包括父类的非静态数据成员但都不包括所有的成员函数)的总和+ vfptr指针(多继承下可能不止一个)+vbptr指针(多继承下可能不止一个)+编译器额外增加的字节。
示例一:含有普通继承
1 class A 2 { 3 }; 4 5 class B 6 { 7 char ch; 8 virtual void func0(){} 9 }; 10 11 class C 12 { 13 char ch1; 14 char ch2; 15 virtual void func(){} 16 virtual void func1(){} 17 }; 18 19 class D: public A, public C 20 { 21 int in; 22 virtual void func(){} 23 virtual void func1(){} 24 }; 25 26 class E: public B, public C 27 { 28 int in; 29 virtual void func0(){} 30 virtual void func1(){} 31 }; 32 33 //cout<<"A="<<sizeof(A)<<endl; //result=1 34 //cout<<"B="<<sizeof(B)<<endl; //result=8 35 //cout<<"C="<<sizeof(c)<<endl; //result=8 36 //cout<<"D="<<sizeof(d)<<endl; //result=12 37 //cout<<"E="<<sizeof(e)<<endl; //result=20
示例二:含有虚继承
1 class CommonBase 2 { 3 int co; 4 }; 5 6 class Base1: virtual public CommonBase 7 { 8 public: 9 virtual void print1() {} 10 virtual void print2() {} 11 private: 12 int b1; 13 }; 14 15 class Base2: virtual public CommonBase 16 { 17 public: 18 virtual void dump1() {} 19 virtual void dump2() {} 20 private: 21 int b2; 22 }; 23 24 class Derived: public Base1, public Base2 25 { 26 public: 27 void print2() {} 28 void dump2() {} 29 private: 30 int d; 31 };
sizeof(Derived)=32,其在内存中分布的情况如下:
class Derived size(32): +--- | +--- (base class Base1) 0 | | {vfptr} 4 | | {vbptr} 8 | | b1 | +--- | +--- (base class Base2) 12 | | {vfptr} 16 | | {vbptr} 20 | | b2 | +--- 24 | d +--- +--- (virtual base CommonBase) 28 | co +---
分类:
C/C++
相关文章推荐
- C++中类对象所占空间的大小
- C++中类对象所占空间的大小
- C++基础之--------虚拟继承的类对象的空间大小
- C++中一个类对象占用的内存空间大小
- C++中类对象所占空间的大小
- C++中 没有数据成员的类的对象所占的内存空间大小问题
- C++中一个类对象占用的内存空间大小
- C++之虚继承和虚函数对C++对象内存模型造成的影响(类/对象的大小)
- c/c++ sizeof运算符详解以及对象大小
- Oracle 表空间利用率及对象大小查询
- 一个类的实例化对象所占空间的大小
- 【深入探索c++对象模型】类对象所需内存大小讨论
- java获取JVM对象实例的个数和占用空间大小
- c++ 命名空间 以及 作用域 函数参数 面向对象实验报告
- C++中类的内存空间大小(sizeof)分析
- c++中的对象大小
- 关于理解《C++ 对象模型》中:把单一元素的数组放在末尾,struct可以拥有可变大小的数组
- C++ 继承中子类空间大小与作用域运算符
- C++中 string对象的大小比较
- 1)C++对象大小计算