结构体占用的存储空间计算

本文介绍了结构体大小的计算方法,强调要遵循字节对齐原则。默认字节对齐有三个准则,作者提出记住第三个准则,即结构体大小为成员中最大字节的整数倍。通过多个结构体示例,展示了如何根据成员顺序和最大字节数计算结构体大小,还说明了成员为另一结构体时的计算方式。

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

原文链接:https://www.cnblogs.com/lykbk/archive/2013/04/02/krtmbhrkhoirtj9468945.html

结构体大小的计算 用最简单的方法,通俗易懂的方法计算结构体大小

结构体计算要遵循字节对齐原则

结构体默认的字节对齐一般满足三个准则:

1) 结构体变量的首地址能够被其最宽基本类型成员的大小所整除;

2) 结构体每个成员相对于结构体首地址的偏移量(offset)都是成员大小的整数倍,如有需要编译器会在成员之间加上填充字节(internal adding);

3) 结构体的总大小为结构体最宽基本类型成员大小的整数倍,如有需要编译器会在最末一个成员之后加上填充字节(trailing padding)

其实 暂且不管这三原则,我的方法只要记住第三个,就是结构体大小结果要为成员中最大字节的整数倍

先看下面定义的两个结构体.

struct {   char a;   short b;   char c; }S1;

struct {  char  a;  char  b;  short c; }S2;

分别用程序测试得出sizeof(S1)=6 , sizeof(S2)=4

注意 为什么 仅仅改变了结构体成员的顺序,结果不一样?

解:

 

(1)首先找出成员变量中最大的字节,可见对于S1和S2 最大是short ,占2个字节,

  (2)所以以后都已2个字节为准,也就是说最多只要2个字节,其他填充占位,注意下图一个格子表示一个字节,

    (3)所以先画2个格子,以后看成员顺序,逐次增加,每次一2为增加基准

    对于S1 ,来说,顺序是 char->short->char      

2个字节
第一个char占一个字节    多的这一个补0,只是占位作用
short 刚好占2个字节 
第二个char也占1个多的这一个补0

 

所以对于S1结构体大小为 2*3=6,至于为什么第二个char,多的那个字节不丢到,就是遵循第三个原则,就是结构体大小结果要为成员中最大字节的整数倍

对于S2 嘛,也画个图,但是顺序是 char->char->short

 

第一个char占一个字节第二个char占一个字节
short 刚好占2个字节 

S2=2*2=4

 

按照这个方法再看这样的一个结构体:

struct stu1
         {
               int i;
                             char c;
               int j;
         };

很明显:最大字节为4个。顺序int  char int

 

stu1
intintintint
char000
第二个intintintint

因为 int占4个,而char已经咱了一个,不够,所以那三个只能多余占位

Stu1=3*4=12

那么换一下呢?

struct stu2
         {
               int i;
                            
               int j;

            char  c;
         };

Stu2=3*4=12;

再看一个:就是当结构体成员变量是另外一个结构体时,只要把结构体中成员为另一结构体作为整体相加就行

 

typedef struct A
{
char a1;
short int a2;
  int a3;
  double d;

};

A=16

typedef struct B
{
long int b2;
short int b1;
A a;

};

而对于B,先不要管A a,也就是先去掉A a 成员结构体B 算得 其为8,所以最后结果为8+16=24;24才是最后结果

### C/C++ 结构体内存布局与存储空间计算 #### 内存对齐原则 编译器按照结构体成员列表的顺序依次为其分配内存。当即将存储的成员需满足特定边界对齐要求时,在成员间可能会插入用于填充的额外字节,以确保后续成员能够放置于合适的地址位置上[^4]。 #### 示例分析 考虑如下定义: ```c struct TAlign { char a; int b; char c; }; ``` 对于此结构体而言,其各字段的具体排列情况取决于目标平台上的数据类型尺寸及其默认对齐约束条件。假设处于典型的32位或64位环境中,则有: - `char` 类型占用1个字节; - `int` 类型通常占据4个字节; 因此,针对上述例子,实际产生的内存分布可能是这样的(单位:字节): | 字段 | 大小 (bytes) | | --- | --- | | a | 1 | | 填充(align to 4)| 3 | | b | 4 | | c | 1 | | 填充(to total size multiple of alignment requirement)| 3 | 最终该结构体会占有至少12个字节的空间,其中包含了必要的填充来保持各个成员之间的适当间隔以及整体结构体自身的对齐属性。 #### 影响因素 不同操作系统、硬件架构下的实现细节会有所差异,比如Windows x86环境下可能采用不同的对齐策略。此外,程序员也可以通过预处理器指令或者编译选项调整这些行为,例如使用GCC提供的 `-fpack-structures` 参数可以改变默认的行为模式[^5]。 #### 总结 综上所述,C/C++中结构体的实际占用空间不仅由显式的成员变量决定,还受到编译环境设定的影响。理解这一点有助于编写高效利用资源的应用程序,并且在跨平台开发过程中尤为重要。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值