Tza*_*rir 42 c colon bit-fields
可能重复:
'unsigned temp:3'表示什么
我正在学习一些内核代码,并且出现在以下行中(在linux 2.4中,sched.h,struct mm_struct):
unsigned dumpable:1;
Run Code Online (Sandbox Code Playgroud)
这是什么意思?
ken*_*ytm 56
这是一个位域成员.您的代码意味着dumpable在结构中占据正好1位.
当您想要以位级包装成员时使用位域.当结构中有很多标志时,这可以大大减少使用的内存大小.例如,如果我们定义一个具有4个具有已知数字约束的成员的结构
0 < a < 20
b in [0, 1]
0 < c < 8
0 < d < 100
Run Code Online (Sandbox Code Playgroud)
然后结构可以声明为
struct Foo {
unsigned a : 5; // 20 < 2^5 = 32
unsigned b : 1; //
unsigned c : 3; //
unsigned d : 7; // 100 < 2^7 = 128
};
Run Code Online (Sandbox Code Playgroud)
那么Foo的位可以像
ddddddd c cc b aaaaa
--------- --------- --------- ----------
octet 1 octet 0
===========================================
uint32
Run Code Online (Sandbox Code Playgroud)
代替
struct Foo {
unsigned a;
unsigned b;
unsigned c;
unsigned d;
};
Run Code Online (Sandbox Code Playgroud)
由于值的范围,浪费了许多位
# wasted space which is not used by the program
# v v
ddddddd ccc
------------------------------------ ------------------------------------
uint32 uint32
b aaaaa
------------------------------------ ------------------------------------
uint32 uint32
Run Code Online (Sandbox Code Playgroud)
所以你可以通过将许多成员打包在一起来节省空间
注意,C标准没有规定如何在"可寻址存储单元"内排列或打包位域.此外,与直接成员访问相比,位域较慢.