Struct中的比特域和对齐问题

struct BitField{
    char     a:2;
    int        b;
    short    c:4;
};    
BitField a;
sizeof(a);

问a的size是多少?

这个问题有两个知识点,比特域和对齐

  • 比特域是为了应对内存十分有限的系统如嵌入式来尽可能的减少内存的使用,语法是在field后面加上使用的bit的个数。有一个比较subtle问题是如果所赋的值超出了field的范围,是怎么处理的?实验的结果是取低位的bit。
  • 对齐是motivation是源于计算机硬件的局限,某些体系结构只能访问特定的内存地址,即数据访问总线长度整数倍,对于32位系统,其数据访问总线是32位的,所以能够访问的地址只能是4的整数倍,才能在一个读写周期完成对一个数据的读写,从而提高效率。具体的对齐规则:
  1. 数据类型自身的对齐值:就是基本数据类型的自身对齐值,比如char类型的自身对齐值为1字节,int类型的自身对齐值为4字节。
  2. 指定对齐值:预编译命令#pragma pack (value)指定的对齐值value。
  3. 结构体或者类的自身对齐值:其成员中自身对齐值最大的那个值,比如以上的struct A的对齐值为4。
  4. 数据成员、结构体和类的有效对齐值:自身对齐值和指定对齐值中较小的那个值。

 

转载于:https://www.cnblogs.com/qzhu/p/3556368.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值