c++类的内存分配方式

              

             面试时有一些经常会问到的问题,其中对于内存字节的分配方式是一个经常被问到和考到的一种题目,前几天同学出去参加面试时就被问到,当时考官的提问是一个空类占几个字节,他回来跟我们说到,我无语的笑了笑,因为真心是不知道,我第一直觉是不占内存,只有实际分配了对象才占内存,但是好像错了。所以就上机测试了一下,发现内存的分配还是很有玄机的,下面就几种情况一一说明。一般分为一下几种情况,我基本上都测试过,而且总结了几个原则,如果有问题希望能够指出。

            先解释一下在c++中的静态数据成员和成员函数的内存分配,静态数据成员是独立与类对象的,不属于单独的某个对象,所有的类对象共享静态数据成员,所以是单独的开辟的一段内存,不占用对象的内存空间,成员函数也是单独的开辟的一段的内存,因为所有的对象调用的也是同样的函数代码,包括inline(内联)函数,所以无论类中定义多少个静态成员和多少个函数,在计算类对象的内存时都可以直接忽略。

            然后就是后面的数据成语的占用的内存字节数的计算,首先说明在32位的Windows下,几种基本的数据类型占用字节数,从小到大,char(1),int(4),float(4),double(8),然后就是类对象的内存计算,当只有两种数据成员时,一般按照长的数据的类型计算,   

class A
{
    double a;
    char b;
};

计算的A的字节数为16,如果为int,char;两种类型,则A的字节数计算为8但是下面的情况要注意:

class AA{
  A a;
  char c;		
};

此时计算的AA的字节数为24,如果把char换成int和double都一样,都是24,因为上面计算了A的字节数为16,下面的一种简单数据类型按8位字节计算。而且超过8位的其他类对象成员,一般都是8的整数倍,就按原来的字长相加即可。也就说都是不足8的倍数的数据类型,需要按最大的数据类型对齐,超过8的按自己的字节数补齐至8的倍数,然后相加。

再然后是包括3个或者3个以上的数据成员的,这个情况比较多,不好说明,但是我在总结了几个原则,

                         1   最大的数据一般不变,然后字节小的类型向大对齐,1,4,8依次变大, 

                         2   分配的字节的类型尽可能统一,尽可能的少,比如说有char,int,A,则为24,

                         3   尽可能的为8的倍数,int ,char,A, D(12),D是我定义的12个字节类型。此时的为40个字节

                         4   尽可能的小,这个是可以肯定的,int,int,D(12),此时为20个字节。

     现在也只能找到这些,如果有更好的希望留言大家一起学习!

 

 


 

        

           

   

           

              

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值