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

c++类的内存分配方式

2013-04-26 13:32 127 查看

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

先解释一下在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个字节。

现在也只能找到这些,如果有更好的希望留言大家一起学习!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: