#include
#include
struct EIGHT_BYTE
{
_Bool opaque :1;
unsigned int fill_color :3;
unsigned int :4;
_Bool show_border :1;
unsigned int border_color :3;
unsigned int border_stype :2;
unsigned int :2;
} eight_byte;
int main(void)
{
printf("sizeof eight_byte is : %lu\n",
sizeof(eight_byte));
return 0;
}
-----------------------
上面的位域结构体占用的字节是16字节,我好像大概能理解为什么是16字节,但是不太明白的是为什么需要填充"unsigned int :4;“ 和“ unsigned int :2;”。这两个好像是用来是字节对齐,但是没太明白到底是怎么个对齐法?
在结构体中,如果有不同类型的成员变量,那么它们引逐本无宽在内存中的存放位置有可能不是连续的。为了提高读取和写入数据的效率,计算机一360问答般按照某种规则将结构体的成员变量排少庆量克须突云皮宗除思列在一起,而这个规则就是字节对齐。 在字节对齐中,编译器一般按照以下规则进行填充: 第一个成员变量放在最开始的位置; 后续的成员变量按照其类型长度占用的字节数进行对齐,比如 cha分维及积r 类型占用 1 个字节,int 类型占用 4 个字节; 如果结构体中的成员变量长度之和不是 2 的幂次方,则进行字节填充脚,使得结构体的长度变为 2 的松护幂次方。 根据上述规则,我们可以分析结构体 EIGHT_BYTE 的占用空间为: _Bool opaque :1高; 占用 1 个 bit,计右社的体业不需要字节对齐; unsigned int fill_color :3; 占用 3 个 bit,不需要字节对齐; unsi守滑武女又号gned int :4; 占用 4 个 bit,需要字节对齐; _Bool show_border :1; 占用 控圆够秋合晚1 个 bit,不需要字节对齐; u规多委外nsigned int border_color 露圆教多试官粮宜福:3; 占用 3 个 bit,不需要字节对齐; unsigned int border_stype :2; 占势边粒氧功表修理用 2 个 bit,不需要字节对齐; unsigned int :2; 占用 2 个 bit,需要字节对齐。 因为 unsigned 善水划重哥视找int 的长度为 4 个字节,所以每个 unsigned int 类型的成员变量占用的空间为 4 个字节。所以,由于 "unsigned in喜程友台t :4;" 和 "unsigned int :2;" 的长度之和为 4 + 2 = 6,不是 2 的幂次方,需要进行字节填充。 最终,结构体 EIGHT_BYTE 的占用空间为: 1 + 3 + 1 + 3 + 2 + 2 + 4 = 16 字节。 需要注意的是,不同的编译器对字节对齐的处理可能会有所不同。
在求职笔试中,C中的位域是一个常考点,特别是在嵌入式软件中更常见。位域的最大样待好处是可以根据自己需要定制位数,从而节省空间,例如:嵌入式编程稀缺的内存资源。还有在网络通讯中,对头信息部分的结构定义也常用到位域,少传输轴或延一位是一位啊。
上一篇:哪些息肉,不能割除