您的位置:首页 > 编程语言 > C语言/C++

C++中类所占内存空间大小

2015-12-21 16:18 351 查看
学习虚继承知识的时候,无意中发现了关于C++类所需内存的面试题,通过sizeof()计算类所需的内存字节数。当时自己就懵了,

因为学习C++的时候,就知道类在声明时是不会分配内存空间的还以为自己学习的东西出错,还来才知道sizeof()作用:sizeof是

C/C++中的一个操作符(operator),简单的说其作用就是返回一个对象或者类型所占的内存字节数。是提前预计类所需要的内存空间。

接下来进行类不同情况,sizeof()的分析

class kong{


};


cout << sizeof(kong)<<endl; //1  空类大小为1


原因:c++要求每个实例在内存中都有独一无二的地址。空类也会被实例化,所以编译器会给空类隐含的添加一个字节,这样空类实例化之后就有了独一无二的地址了。所以空类的sizeof为1。

class data2{

int a;

char s;

};


cout << sizeof(data2)<<endl; //8    包含了对齐


各个数据类型的所占内存大小

class data3{

int a;

char s;

virtual void kong();

virtual void kong1();

};


cout << sizeof(data3)<<endl; //无virtual 8  有virtual 12  多个virtual 仍为 12


原因:C++ 类中有虚函数的时候有一个指向虚函数的指针(vptr),在32位系统分配指针大小为4字节。无论多少个虚函数,只有这

一个指针,4字节。



class data4:public data3

{

virtual void kong2();

//   virtual void kong3();

};



cout << sizeof(data4)<<endl;


data4继承data3的时候分了几种情况讨论:

1 data3类(包含virtual),data4(不包含virtual)直接继承data3 输出为12 ;

C++ 类中有虚函数的时候有一个指向虚函数的指针(vptr),在32位系统分配指针大小为4字节。无论多少个虚函数,只有这一个指

针,4字节。并且子类的大小是本身成员变量的大小加上父类的大小。 父类12 子类0

若data4(不包含virtual)虚继承data3 输出为16

父类12加上子类的virtual(4) 16

2 data3类(包含virtual),data4(包含virtual)直接继承data3 输出为12

父类12,子类0,原因:如果子类直接继承父类,他们是共享一个虚函数指针

若是data4(包含virtual)虚继承data3,输出为16

父类12,子类虚函数指针4
输出16

3 data3类(不包含virtual),data4(包含virtual)直接继承 输出为12 若data4(不包含virtual)输出为8

父类为8 子类虚函数指针4 输出为12 父类8 子类0 输出8

data4(包含virtual)虚继承输出为 12 data4(不包含virtual)
输出为12

父类8 子类虚函数指针4 输出12,并且多个虚函数 只用一个指针

以上过程 大家可以直接建立一个控制台程序,进行实验

总结:

1 如果有多个virtual函数,只有一个指针(4个字节)

2 子类直接继承父类,若父中由virtual,则父子共享一个指针用来指定虚函数的虚拟函数表的入口地址。

3 若子类虚继承,则子类有自己的一个虚函数指针
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: