结构体位域定义与#Pragam pack()

位域

定义结构体时,有时会使用位域来定义变量,这样能够最大限度的节省内存空间。我们知道,一个字节占8位。如不使用位域定义,我们一般定义变量为:
U8 addr;
这个变量占8位字节。取值范围为0-255,可如果我们定义的变量,取值范围达不到255的级别,那么8位的字节中许多bit位就浪费掉了。不要小看这几个bit位,在嵌入式系统中,尤其是硬件资源紧张的情况下,每一个bit都应该能发挥自己的作用。这就需要我们灵活使用位域来定义。

典型例子

一个典型的例子是定义开关标志量。开关量一般取值为01,因此仅用1个bit位表示即可。这种情况可以使用位域来定义。如下
struct Flag_ST {
U8 flag1 :1;
U8 flag2 :1;
U8 flag3 :1;
U8 reserved : 5; }

按照上面的定义,三个flag变量每个都占用一位的空间,整个结构体也只占用一个字节的长度。

字节对齐 #Pragam pack()

定义位域之前,需要了解字节对齐。可使用#Pragam pack(n)来实现。括号中的n代表n个字节对齐。举个例子,
假设
U4型占4字节,也就是32
U2型占2字节,也就是16
U1型占1字节,也就是8
那么定义结构体
struct Flag_ST {
U4 flag1 ;
U2 flag2 ;
U1 flag3 ;}

则整个结构体我们计算是占用7个字节长度。但实际计算sizeof时会发现占用8个字节。这是因为系统默认4字节对齐,而U1U2由于加起来不够4个字节,因此被放在了一个4字节单位中,8个字节中的最后一个字节被空了出来,也就浪费了。
如果我们在定义这个结构体之前加上
#Pragam pack(1)
让系统1字节对齐,那么计算sizeof时我们会发现该结构体占用7字节内存,不会造成内存的浪费。

v v v v v v

本文为作者原创,请勿转载,转载请联系作者。
点击下方卡片,关注我的公众号,有最新的文章和项目动态。

v v v v v v

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

董董灿是个攻城狮

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值