首先来看两个结构体:
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("%d %d\n",sizeof(s1),sizeof(s2));
输出结果是:16,24;
理论上是这样的,首先是i在相对0的位置,占8位一个字节;然后j就在相对一个字节的位置,由于一个位置的字节数是4位的倍数,因此不用对齐,就放在那里;然后是a,要在3位的倍数关系的位置上,因此要移1位,在15位的位置上放下,目前总共是18位,即2字节2位。由于double是8字节的,因此要在相对0是8个字节的位置上放下,因此从18位开始到8个字节之间的位置被忽略,直接放在8字节的位置了。因此总共是16个字节。
第二个最后会对照是不是结构体内最大数据的倍数,不是的话,会补成是最大数据的倍数。
使用位域的主要目的是压缩存储。
struct node
{
char onstatus; //1
char offstatus; //1
char allnums; //6
}
1) 如果相邻位域字段的类型相同,且其位宽之和小于类型的sizeof大小,则后面的字段将紧邻前一个字段存储,直到不能容纳为止
2) 如果相邻位域字段的类型相同,但其位宽之和大于类型的sizeof大小,则后面的字段将从新的存储
理解C语言结构体中的位域存储

本文探讨了C语言中结构体内的位域内存分布。内容包括位域的存储规则,例如位域字段的排列和对齐方式,以及不同编译器可能存在的实现差异。位域的主要目的是为了压缩存储,但在某些情况下,如字段类型不同或穿插非位域字段时,编译器处理方式各异。此外,位域长度受限于字节大小,不能跨字节,并且可以使用无名位域进行填充和调整位置。
最低0.47元/天 解锁文章
8212

被折叠的 条评论
为什么被折叠?



