我正在学习一些内核代码,并且出现在以下行中(在linux 2.4,sched.h,struct mm_struct中):
unsigned dumpable:1;
这是什么意思?
答案 0 :(得分:54)
这是bitfield成员。您的代码意味着dumpable
在结构中只占1位。
当您想要以位级别打包成员时,使用位域。当结构中有很多标志时,这可以大大减少使用的内存大小。例如,如果我们定义一个具有4个具有已知数字约束的成员的结构
0 < a < 20
b in [0, 1]
0 < c < 8
0 < d < 100
然后结构可以声明为
struct Foo {
unsigned a : 5; // 20 < 2^5 = 32
unsigned b : 1; //
unsigned c : 3; //
unsigned d : 7; // 100 < 2^7 = 128
};
然后Foo 的位可以排列
ddddddd c cc b aaaaa
--------- --------- --------- ----------
octet 1 octet 0
===========================================
uint32
而不是
struct Foo {
unsigned a;
unsigned b;
unsigned c;
unsigned d;
};
由于值的范围而浪费了许多位
# wasted space which is not used by the program
# v v
ddddddd ccc
------------------------------------ ------------------------------------
uint32 uint32
b aaaaa
------------------------------------ ------------------------------------
uint32 uint32
因此您可以通过将许多成员打包在一起来节省空间。
注意,C标准没有规定如何在“可寻址存储单元”内排列或打包位域。此外,与直接成员访问相比,位域较慢。
答案 1 :(得分:5)
这意味着它是一个位域 - 即dumpable的大小是一个位,你只能为它分配0或1。通常在旧代码中用于节省空间,或者在与硬件接口的低级代码中使用(即使打包是不可移植的)。有关详细信息,请参阅here
答案 2 :(得分:3)
如果我没记错的话,在结构中使用时,冒号后面的数字表示构成变量(或位域)的位数。
所以unsigned dumpable:1;
是一位位域。