首页 > 代码库 > c++类占内存空间大小计算

c++类占内存空间大小计算

x64环境下实现:

  1 #include <iostream>  2   3 using namespace std;  4   5 class kong{  6   7 };  8   9 class kong1{ 10  11 }; 12  13 class kong2{ 14  15 }; 16  17 class data2 18 { 19     int a;    //4个字节 20     char s; 21 }; 22  23 class data3 24 { 25     int a; 26     char s; 27     virtual void kong();      //在64位系统分配指针大小为8字节 28     virtual void kong1(); 29 }; 30  31 class data4 : public data3 32 { 33      34 }; 35  36 class data5 : virtual public data3 37 { 38  39 }; 40  41 class data6 : public data3 42 { 43     virtual void kong(); 44 }; 45  46 class data7 : virtual public data3 47 { 48     virtual void kong(); 49 }; 50  51 class data8 : public data2 52 { 53     virtual void kong(); 54 }; 55  56 class data9 : public data2 57 { 58      59 }; 60  61 class data10 : virtual public data2 62 { 63     virtual void kong(); 64 }; 65  66 class data11 : virtual public data2 67 { 68      69 }; 70  71 int main() 72 { 73     //c++要求每个实例在内存中都有独一无二的地址。空类也会被实例化,所以编译器会给空类隐含的添加一个字节,这样空类实例化之后就有了独一无二的地址了。所以空类的sizeof为1 74     kong ko; 75     cout << sizeof(ko) << " " << sizeof(kong) << endl; 76  77     //包含了对齐,64位int型4个字节 78     data2 da; 79     cout << sizeof(da) << " " << sizeof(data2) << endl; 80  81     //C++ 类中有虚函数的时候有一个指向虚函数的指针(vptr),在32位系统分配指针大小为4字节,在64位系统分配指针大小为8字节。无论多少个虚函数,只有这一个指针,8字节 82     cout << sizeof(data3) << endl; 83  84     //data3类(包含virtual),data4(不包含virtual)直接继承data3 输出为16, C++ 类中有虚函数的时候有一个指向虚函数的指针(vptr),在64位系统分配指针大小为8字节。无论多少个虚 85     //函数,只有这一个指针,8字节。并且子类的大小是本身成员变量的大小加上父类的大小。 父类16 子类0 86     cout << sizeof(data4) << endl; 87  88     //若data5(不包含virtual)虚继承data3, 输出为24, 父类16加上子类的virtual(8),指针8 89     cout << sizeof(data5) << endl; 90  91     //data3类(包含virtual),data6(包含virtual)直接继承data3 输出为16, 原因:如果子类直接继承父类,他们是共享一个虚函数指针 92     cout << sizeof(data6) << endl; 93  94     //若是data7(包含virtual)虚继承data3,输出为24, 父类16,子类虚函数指针8 输出24 95     cout << sizeof(data7) << endl; 96  97     //data2类(不包含virtual),data8(包含virtual)直接继承 输出为16, 父类为8 子类虚函数指针8 输出为16 98     cout << sizeof(data8) << endl; 99 100     //若data9(不包含virtual)直接继承data2类(不包含virtual),输出为8, 父类8 子类0 输出8101     cout << sizeof(data9) << endl;102 103     //data10(包含virtual)虚继承data2类(不包含virtual), 输出为 24, 父类为8 ,虚基类指针为8,子类虚函数指针8 输出为24104     cout << sizeof(data10) << endl;105 106     //data11(不包含virtual)虚继承data2类(不包含virtual), 输出为 16, 父类为8 ,虚基类指针为8, 输出为16107     cout << sizeof(data11) << endl;108 109 110     //如果有多个virtual函数,只有一个指针111     //若子类虚继承,则子类有自己的一个虚函数指针112     //子类直接继承父类,若父中由virtual,则父子共享一个指针用来指定虚函数的虚拟函数表的入口地址113 114     return 0;115 }

 

结果(单位:字节):
技术分享

 

c++类占内存空间大小计算