BitField in struct/union in C

ysyx · 03-10 · 68 人浏览
BitField in struct/union in C

阅读NEMU源码时,发现了没见过的结构体成员声明方式,就是这个":",问了gpt并STFW了解这个叫做位域指定(Bitfield)。

Bitfiled设计的目的应该是用于节省内存空间,比如对于一个开关类型,只需要考虑0和1两种可能,需要的内存只有1b,但是如果你用int存,就会占用16/32位(具体基于平台),如下,gate, b, c三个变量都会存在一个字节里,提升了内存利用率。

(虽然在目前的32位机下,整体结构体还是会占4B(可以考虑用printf+sizeof或者gdb调试)

struct oneByte  
{  
  int gate:1;  
  int b:2;  
  int c:6;  
};  

当然,考虑到内存访问效率,BItField的使用是基于字节对齐的。

struct twoBytes  
{  
  int gate:1;  
  int b:3;  
  int c:6;  
};  

结构体中第一个字节前四位(@这里说法可能有BUG,考虑到小端法,这个前四位会是低四位还是高四位呢?)被gate和b占用,后面四位为空,c占用第二个字节的六位。

Ref:

关于位结构体及位操作总结_c语言结构体位操作-CSDN博客

Bit Fields in C

ysyx C
Theme Jasmine by Kent Liao