【C/C++】一个结构体变量占多大内存空间的问题

本文详细解析了不同格式的结构体在内存中的布局方式,以及如何通过合理布局提高存储空间利用率。通过实例说明了结构体成员排列顺序对内存占用的影响,强调了优秀程序员应掌握的内存对齐技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

原文链接: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个字节。这是错的。

错误分析:计算结构体大小时需要考虑其内存布局,编译系统为了提高计算机访问数据的效率,在安排结构体每个成员的时候采用了内存对齐的方法,具体是:结构体在内存中的存放按单元进行存放,每个单元的大小取决于结构体中最大基本类型的大小

对格式一:

图1

​​​​因为所有成员中B成员类型最大(int型占用4个字节),故结构体Phone1在内存分布时以4字节为一个单元来存储每个成员。又因为A占用一个字节后,只剩下3字节了,放不下后面紧挨的成员B了,所以必须开辟一个新的单元来存放B,B刚好占满一个单元,接下来的成员C又必须再开辟一个新的单元来存放。这样,Phone1占用的字节数就是:3*4=12;

同理对于格式二,

图2

A后面还有三个字节,足够存放C,所以C就放在了A的后面,然后只剩下一个字节了,不够存放后面的B,于是又开辟一个新单元存放B。这样,Phone2占用的内存字节就为2*4=8。

对于格式三: 

 图3

​上面结构体中,最大数据类型是char,占一个字节,因此它的一个存储单元就是1个字节。sizeof(Phone3) =1 + 2 + 4 = 7, 其大小正好是结构体中各成员所占内存空间之和,这种情况也是最节省存储空间的。

对于格式四:

图4

​Phone4中最大的数据类型是double,占8个字节,因此它的一个存储单元就是8个字节。由上图可知sizeof(Phone4)=4*8=32。

综上所述,格式一和格式四是非常浪费存储空间的,应该尽力避免;格式三对存储空间的利用率是最高的;格式二存储空间的利用率居中。作为一个优秀的程序员,应该深入掌握这些写法的差异性,以便视情况选用不同的写法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值