亲宝软件园·资讯

展开

c++ class成员与分配内存 c++ class中成员与分配内存的问题详解

gonghw403 人气:0
想了解c++ class中成员与分配内存的问题详解的相关内容吗,gonghw403在本文为您仔细讲解c++ class成员与分配内存的相关知识和一些Code实例,欢迎阅读和指正,我们先划重点:c++内存分配方式,c++,class成员,c++中class的用法,下面大家一起来学习吧。

1.内存补齐

便于管理类(生成的对象)的内存,类总内存总是为最大成员字节大小的倍数,不足的会进行内存补齐

类的整体内存就是由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

2.特殊情况--virtual函数

如果一个类里面有虚函数,类会自动生成一个虚函数表指针,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;
};

3.不需要考虑的内存

每个对象所占用的存储空间只是该对象的数据部分(虚函数指针和虚基类指针也属于数据部分)所占用的存储空间,而不包括函数代码所占用的存储空间

一些看似成员的要注意不算内存

如:

一.静态函数和变量 :

静态函数和变量都不属于类管理,统一在常量内存区里面

二.非虚函数的成员函数 :

不是每一个对象都会生成成员函数,类的成员函数在其他内存区,对象用this指针调用的成员函数,其地址固定

三.友元函数和非虚函数的成员函数性质一样

总结

加载全部内容

相关教程
猜你喜欢
用户评论