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个字节。
现在也只能找到这些,如果有更好的希望留言大家一起学习!
相关文章推荐
- C++中内存的五种分配方式
- 理顺一下C++三种内存分配方式
- 转:内存分配方式及常见错误
- C++类在内存的分配问题
- 内存分配方式
- 编译器对变量的内存分配方式
- C/C++ 内存分配方式,堆区,栈区,new/delete/malloc/free
- 内存分配的方式
- C++内存分配方式详解——堆、栈、自由存储区、全局/静态存储区和常量存储区
- 内存分配方式
- C++类对象成员变量和成员函数内存分配的问题
- 内存分配方式之基本分页
- C++内存分配方式详解——堆、栈、自由存储区、全局/静态存储区和常量存储区
- C/C++ 内存分配方式,堆区,栈区,new/delete/malloc/free
- C/C++内存分配方式
- c++中的内存分配方式,以及使用过程中需要小心的地方
- 描述内存分配方式以及它们的区别?
- Windows以及c++内存分配方式
- C语言程序的内存分配方式
- SGI STL 内存分配方式及malloc底层实现分析