结构体与位域的对齐

1、结构体对齐

按照结构体中最大字节元素的字节个数对齐,比方说有最大基本元素数据类型为int,按照4字节对齐。最大为short,按照2字节对齐。

typedef struct    //最大的元素的基本数据类型为(int)4个字节
{
  char numChar;  //占据一个字节
  int numInt;    //第一个位只剩3字节,无法容下int,只能占据第二位(四字节为一个对齐单位)。
  short numShort;  //占据第三位,补上2个字节。
}test1;    //sizeof(test1)=12;
typedef struct
{
  int numInt;
  char numChar;
  short numShort;
}test2;  //sizeof(test2)=8;
typedef struct
{
  short numInt;
  char hah;
  short numShort;
  char numChar;
}test3;  //sizeof(test3)=8;
2、位域结构体

位结构体是一种特殊的结构体,在需访问某个字节或者某个字节的指定位的时候,位结构体比按位操作简便

typedef struct {
  float adCheckValue;   //AD判断阈值
  int tianNum;   //车号
  struct{
    char checkStatus : 4;   //自检状态,占据第一个字节(char)的低四位。
    char AlarmStatus : 4;   //报警状态,占据第一个字节(char)的高四位。
    ushort overFlowCnt : 8;  //失稳溢出计数,占据第三个字节
    ushort isOpen : 1;  //占据第3个字节的第0位
  }statusData; //4
}OriginalData; //12

位域:
位域是指为位为单位来定义某结构体的成员变量 它和结构体是分不开的
位域的一些使用:
1.位域变量仅限整型
2.位域变量的长度不能够超过其本身类型的长度
3.如果某一位域要从一个新的类型对齐处开始 可以在前面加一个长度为0的匿名位域 unsigned :0
4.匿名位域长度不为0时 只起占位的作用
5.一个位域必须容纳在同一个其类型对齐长度内
关于位域对齐更多资料(网上摘录):
/*************************************************************************
C99规定int、unsigned int和bool可以作为位域类型,但编译器几乎都对此作了扩展,
允许其它类型类型的存在。
使用位域的主要目的是压缩存储,其大致规则为:
1) 如果相邻位域字段的类型相同,且其位宽之和小于类型的sizeof大小,则后面的字段将紧邻前一个字段存储,直到不能容纳为止;
2) 如果相邻位域字段的类型相同,但其位宽之和大于类型的sizeof大小,则后面的字段将从新的存储单元开始,其偏移量为其类型大小的整数倍;(经测试此条好像仅限于char型,整型可以跨域存储)
3) 如果相邻的位域字段的类型不同,则各编译器的具体实现有差异,VC6采取不压缩方式,Dev-C++采取压缩方式;
4) 如果位域字段之间穿插着非位域字段,则不进行压缩;
5) 整个结构体的总大小为最宽基本类型成员大小的整数倍。
***************************************************************************/

           struct s1 
           { 
           int i: 8; 
           int j: 4; 
           int a: 3; 
           double b; 
           }; 

           struct s2 
           { 
           int i: 8; 
           int j: 4; 
           double b; 
           int a:3; 
           }; 

           printf("sizeof(s1)= %d\n", sizeof(s1)); 
           printf("sizeof(s2)= %d\n", sizeof(s2)); 
           result: 16, 24 
           第一个结构体中,i,j,a共占15个位,不足8个字节,按double 8字节对齐,共16字节

   第二个结构体中,i,j共占12位,不足8字节,按8字节对齐,a也按8字节对齐,加上double共8+8+8=24个字节

3.具体例子测试:
https://blog.csdn.net/lizi_stdio/article/details/77203335
注意自己运行一下,该博客给的答案部分有问题。

转载:
1.https://www.cnblogs.com/xian-yongchao/p/9542561.html
2.https://blog.csdn.net/WUDAIJUN/article/details/8196829?spm=1001.2101.3001.6650.2&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7Edefault-2.no_search_link&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7Edefault-2.no_search_link
3.https://blog.csdn.net/lizi_stdio/article/details/77203335

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值