C中内存分布,以及优化

首先看如下代码:

#include <stdio.h>
struct mybitfields
{
    unsigned short a : 4;
    unsigned short b : 5;
    unsigned short c : 7;
} test;
 
void main(void)
{
    int i;
    test.a = 2;
    test.b = 16;
    test.c = 0;
 
    i = *((short *)&test);
    printf("%d\n", i);
}


上述程序输出为:258

因为结构体中a只占4位,b5位,c七位,由于内存需要字节对齐。如果是小段存储的话,则分布为00000010,00000001。由于是小段存储,低位在低位,高位存在高位。所以如果用两字节的short来获取,则为00000010,00000001,取值为2^8+2 = 256。即优先补全字节的高位,当高位满了,然后再取后面的内存继续存储。

同理,如果b=3,则结果又是什么呢?

答案是50。

为什么呢?同理在内存中,可以看到分布是00110010,00000000。所以以两个字节获取后大小为3*16+2=50,(注意小端存储模式,以及short的字节数);

同时注意,在确定多少字节作为一个数的时候,注意只看指针的类型,如本例中尽管i是int型4个字节,但指针为short*,所以去内存时为两字节存储。

由上面的分析,现在如果c=1,输出为多少呢?答案是770.

如果将c的位数改为8位会是什么情况?

如果是

i = *((short *)&test);则i变回258了,因为有字节对齐,所以内存分布如下,用16进制,02,01,01,00,因为是short指针,所以为256+2=258;
i= *((int*)&test);则i为65794,2^16+^8+2=65794;
总之,可以理解为,根据字节对齐理论,一般对齐为2的倍数,或者和最大字节宽度。然后根据内存大小来填满。如果比较紧张就凑在一个字节填满,还是要注意高位低位,小端的是高位填高位。


不过其实我还是有一个地方不明白:为什么a和b能够挤在一个字节,而c为什么不能和b一起挤在一起呢?求解释




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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值