这篇文章主要介绍“如何理解c++ class中成员与分配内存的问题”,在日常操作中,相信很多人在如何理解c++ class中成员与分配内存的问题问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”如何理解c++ class中成员与分配内存的问题”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!
1.内存补齐
2.特殊情况--virtual函数
3.不需要考虑的内存
总结
便于管理类(生成的对象)的内存,类总内存总是为最大成员字节大小的倍数,不足的会进行内存补齐
类的整体内存就是由n块最大成员字节大小的区域组成的
而内存的分配对于成员变量来说是按照书写顺序来的(也就是构造顺序)如果不足最大成员大小,就自动填充
后一位变量如果无法排在前一位变量的那一块内存里面,就直接再开拓一块最大成员字节大小的空间存放自己,前一位的剩余空间自动填充
class A{ //sizeof = 8 int a; char b; short c; }; class B{ //sizeof = 12 char a; int b; short c; };
上面类A,B,最大都是int 4字节 :
A类,第一个是int ,4字节全部填满; 第二个char,1字节,还剩3字节;第三个short,2字节,补在第二个空间后,还剩一个字节自动补齐,一共2*4=8字节
B类,第一个是char,1字节,还剩三个字节;第二个int,4字节,第一个剩的空间不够,直接开拓下一个4字节,剩下的三字节自动填满;第三个short,2字节,还剩2字节自动补齐,一共3*4=12
如果一个类里面有虚函数,类会自动生成一个虚函数表指针,4字节的来管理虚函数
一个类无论有几个虚函数都只有有一个四字节的指针
而且这个指针在其他成员之前生成,也就是和你写虚函数的顺序无关
比如:
class A{ //实际上sizeof = 2*4=8 ,而不是12 char a; virtual void f() {} short b; };
上面等价于
class A{ T *table //虚函数指针 char a; short b; };
按照上面的方法可得sizeof = 8
同样,由于虚函数指针是四个字节,如果成员里面有更高字节的,同样内存补齐
class A{ //sizeof = 8*2 = 16 virtual void f() {} double a; };
每个对象所占用的存储空间只是该对象的数据部分(虚函数指针和虚基类指针也属于数据部分)所占用的存储空间,而不包括函数代码所占用的存储空间
一些看似成员的要注意不算内存
如:
一.静态函数和变量 :
静态函数和变量都不属于类管理,统一在常量内存区里面
二.非虚函数的成员函数 :
不是每一个对象都会生成成员函数,类的成员函数在其他内存区,对象用this指针调用的成员函数,其地址固定
三.友元函数和非虚函数的成员函数性质一样
到此,关于“如何理解c++ class中成员与分配内存的问题”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注亿速云网站,小编会继续努力为大家带来更多实用的文章!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。