原文链接:http://blog.sina.com.cn/s/blog_75a2ecd20102xca0.html
一个结构体变量占多大内存空间的问题
直接来看相同数据结构体的几种书写的格式吧。
格式一:
1. struct tagPhone
2. {
3. char A;
4. int B;
5. short C;
6. }Phone1;
格式二:
1. struct tagPhone
2. {
3. char A;
4. short C;
5. int B;
6. }Phone2;
格式三:
1. struct tagPhone3
2. {
3. char A;
4. char B[2];
5. char C[4];
6. }Phone3;
格式四:
1. struct tagPhone3
2. {
3. char A;
4. double B[2];
5. char C[4];
6. }Phone4;
例题:请问下面定义的结构体变量aa在计算机内存中占用多少字节?
#include
main()
{
struct student
{ float height;
short int age ;
char sex ;
}aa;
printf("%d\n",sizeof(aa)); //屏幕上将显示多少?
}
错误解答:我们都知道,char类型占用1个字节,float型占用4个字节,short int类型占用2个字节,int型在VC6.0中占用4个字节(TC2.0中占用2个字节),long占用8个字节,double占用8个字节。因此,我们可能会犯一个错误就是直接4+2+1=7,结构体aa占用7个字节。这是错的。
错误分析:计算结构体大小时需要考虑其内存布局,编译系统为了提高计算机访问数据的效率,在安排结构体每个成员的时候采用了内存对齐的方法,具体是:结构体在内存中的存放按单元进行存放,每个单元的大小取决于结构体中最大基本类型的大小。
对格式一:
因为所有成员中B成员类型最大(int型占用4个字节),故结构体Phone1在内存分布时以4字节为一个单元来存储每个成员。又因为A占用一个字节后,只剩下3字节了,放不下后面紧挨的成员B了,所以必须开辟一个新的单元来存放B,B刚好占满一个单元,接下来的成员C又必须再开辟一个新的单元来存放。这样,Phone1占用的字节数就是:3*4=12;
同理对于格式二,
A后面还有三个字节,足够存放C,所以C就放在了A的后面,然后只剩下一个字节了,不够存放后面的B,于是又开辟一个新单元存放B。这样,Phone2占用的内存字节就为2*4=8。
对于格式三:
上面结构体中,最大数据类型是char,占一个字节,因此它的一个存储单元就是1个字节。sizeof(Phone3) =1 + 2 + 4 = 7, 其大小正好是结构体中各成员所占内存空间之和,这种情况也是最节省存储空间的。
对于格式四:
Phone4中最大的数据类型是double,占8个字节,因此它的一个存储单元就是8个字节。由上图可知sizeof(Phone4)=4*8=32。
综上所述,格式一和格式四是非常浪费存储空间的,应该尽力避免;格式三对存储空间的利用率是最高的;格式二存储空间的利用率居中。作为一个优秀的程序员,应该深入掌握这些写法的差异性,以便视情况选用不同的写法。