C 位段的内存分配

什么是位段?

strucr code
{
  int c1 :7;
  int c2 :6;
  int c3 :19;
}


 

这就是位段了。跟结构体很类似,不过他在每个成员的定义的后面多加了一个 : 跟一个数字,这个数字用来限定这个成员所占内存的bit位。这就是说,c1占了占7位,c2占了6位,c3占了19位,加在一起32位,才一个字节。这样,本来要占3个字节的结构体,现在一个字节就搞定了,这样就节省了很多很多的内存空间。

 

结构体有内存对齐,那么位段有没有呢?答案是位段也有对齐,不过跟结构体的不大相同就是了。位段的存储有几个特点:

1:他的成员的大小不能比机器定义的类型大。比如,一个int占32位,你非要给它33位,这样就不行了,就想气球一样,会炸的- -

2:当上一个成员的剩余字节 不够存储下一个成员时,他会另起 一个字开始存储,比如,{   int c1:20;  int c2:20  },int是32位的,c1用了20位,剩余的12位不够存放c2,那么就另外 拿出32位,并从起始的地方存储c2。所以这样一共占用了两个字节。如果把刚才的c2改成12位火12位一下,那么c1用剩的空间c2就够用了,所以他会紧跟着c1结束的地方开始存放,这样一共就占用了32位,也就是1个字节了。

3:位段中的对齐数是根据其中成员最大类型来定的。比如{  int c1:26; char c2:7  },int型的c1用了26位,不够放c2的7位,那么,他对拿出int型的32位来,从开始的地方存放这7位的char c2,而不是拿出8位的char类空间来存放。  所以,上例一共会占用64位,也就是8个字节。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值