C++ 类对象大小计算(一)常规情况
2018-01-13 16:24
302 查看
C++类对象计算需要考虑成员变量大小,内存对齐,是否有虚函数,是否有虚继承等
1. 空类
结论:不含任何成员变量,且在一般继承(不含虚继承)情况、情况下,无论是基类还是派生类,所有类的大小均为1字节。这1个字节的空间是系统为该类的对象创建的一个占位符,表示该对象仅仅是存在而已,而没有实际内容。
2. 仅有常规函数、无成员变量类
仅包含一般成员函数(即没有虚函数),不含成员变量时,运行结果和(一)是一样的,系统也只是为对象创建了1个字节的占位符。因此,我们可以得出结论是,一般成员函数不会对类的大小造成影响。
3. 含有一般成员变量类
依次继承的三个类中含有相同数量,
4000
相同类型的一般成员变量(不含静态成员变量)。此种情况下,类对象大小=基类对象大小+自身成员大小。A当中三个字符变量3个字节,一个整形变量4个字节,考虑内存对齐因素(默认为4),A类对象大小为8。B类对象大小为A类对象大小基础上再加8,C类对象大小在B类对象大小基础上再加8。
4. 含静态成员变量的类
可以看到,类对象大小没有因为增加了静态成员而变化。因为静态成员是属于类成员共有的,不单独属于任何一个对象,对静态成员的存储不会选择在某个对象空间,而是存在于堆当中,因此不会对对象的大小造成影响。
1. 空类
#include <iostream> using namespace std; class A { }; class B : public A{ }; class C : public B{ }; int main() { A a; B b; C c; cout<<"size of a:"<<sizeof(a)<<endl; cout<<"size of b:"<<sizeof(b)<<endl; cout<<"size of c:"<<sizeof(c)<<endl; return 0; }运行结果为:
结论:不含任何成员变量,且在一般继承(不含虚继承)情况、情况下,无论是基类还是派生类,所有类的大小均为1字节。这1个字节的空间是系统为该类的对象创建的一个占位符,表示该对象仅仅是存在而已,而没有实际内容。
2. 仅有常规函数、无成员变量类
#include <iostream> using namespace std; class A { public: A(int x=0) { cout<<"A"<<x<<endl; } void printA() { cout<<"Hello A"; } }; class B :public A{ public: B(int x=0) { cout<<"B"<<x<<endl; } void printB() { cout<<"Hello B"; } }; class C : public B{ public: C() { cout<<"C"<<endl; } void printC() { cout<<"Hello C"; } }; int main() { A a; B b; C c; cout<<"size of a:"<<sizeof(a)<<endl; cout<<"size of b:"<<sizeof(b)<<endl; cout<<"size of c:"<<sizeof(c)<<endl; return 0; }运行结果为:
仅包含一般成员函数(即没有虚函数),不含成员变量时,运行结果和(一)是一样的,系统也只是为对象创建了1个字节的占位符。因此,我们可以得出结论是,一般成员函数不会对类的大小造成影响。
3. 含有一般成员变量类
#include <iostream> using namespace std; class A { public: A(int x=0) { cout<<"A"<<x<<endl; } void printA() { cout<<"Hello A"; } private: char Data1[3]; int Data2; }; class B :public A{ public: B(int x=0) { cout<<"B"<<x<<endl; } void printB() { cout<<"Hello B"; } private: char Data1[3]; int Data2; }; class C : public B{ public: C(int x=0) { cout<<"C"<<x<<endl; } void printC() { cout<<"Hello C"; } private: char Data1[3]; int Data2; }; int main() { A a; B b; C c; cout<<"size of a:"<<sizeof(a)<<endl; cout<<"size of b:"<<sizeof(b)<<endl; cout<<"size of c:"<<sizeof(c)<<endl; return 0; }运行结果为:
依次继承的三个类中含有相同数量,
4000
相同类型的一般成员变量(不含静态成员变量)。此种情况下,类对象大小=基类对象大小+自身成员大小。A当中三个字符变量3个字节,一个整形变量4个字节,考虑内存对齐因素(默认为4),A类对象大小为8。B类对象大小为A类对象大小基础上再加8,C类对象大小在B类对象大小基础上再加8。
4. 含静态成员变量的类
#include <iostream> using namespace std; class A { public: A(int x=0) { cout<<"A"<<x<<endl; } void printA() { cout<<"Hello A"; } private: char Data1[3]; int Data2; static int Data3; }; class B: public A { public: B(int x=0) { cout<<"B"<<x<<endl; } void printB() { cout<<"Hello B"; } private: char Data1[3]; int Data2; static int Data3; }; class C : public B{ public: C(int x=0) { cout<<"C"<<x<<endl; } void printC() { cout<<"Hello C"; } private: char Data1[3]; int Data2; static int Data3; }; int main() { A a; B b; C c; cout<<"size of a:"<<sizeof(a)<<endl; cout<<"size of b:"<<sizeof(b)<<endl; cout<<"size of c:"<<sizeof(c)<<endl; return 0; }运行结果为:
可以看到,类对象大小没有因为增加了静态成员而变化。因为静态成员是属于类成员共有的,不单独属于任何一个对象,对静态成员的存储不会选择在某个对象空间,而是存在于堆当中,因此不会对对象的大小造成影响。
相关文章推荐
- C++回顾之static成员、static成员函数及类对象大小计算
- C++ 类对象大小计算(二)含有虚函数类
- C++回顾之static成员、static成员函数及类对象大小计算
- 三十二、C++内存布局,对象大小计算、虚函数虚继承对类内存模型的影响
- C++类对象大小的计算(一)常规类大小计算
- 1)C++对象大小计算
- C++中虚函数工作原理和(虚)继承类的内存占用大小计算
- C++中虚函数工作原理和(虚)继承类的内存占用大小计算
- c++ 类的对象的大小
- C++中一个类对象占用的内存空间大小
- C++中虚函数工作原理和(虚)继承类的内存占用大小计算
- C++中虚函数工作原理和(虚)继承类的内存占用大小计算
- C++混合学习-类的大小计算sizeof(className)
- C++中虚函数工作原理和(虚)继承类的内存占用大小计算
- C++中虚函数工作原理和(虚)继承类的内存占用大小计算
- 从零开始学C++之对象的使用(一):static 成员变量、static 成员函数、类/对象的大小
- 计算对象大小
- C++中虚函数工作原理和(虚)继承类的内存占用大小计算
- C++中类对象所占空间的大小
- 两种计算Java对象大小的方法