在C中,冒号在一个声明中意味着什么?

可能重复:
什么是'unsigned temp:3'的意思

我正在学习一些内核代码,并沿着下面的行(在Linux 2.4中,sched.h,struct mm_struct):

unsigned dumpable:1; 

这是什么意思?

这是一个位域成员。 你的代码意味着dumpable在结构中占据1位。

当您想要在比特级中打包成员时使用位域。 当结构中有很多标志时,这可以大大减less使用的内存的大小。 例如,如果我们定义一个具有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 # vv ddddddd ccc ------------------------------------ ------------------------------------ uint32 uint32 b aaaaa ------------------------------------ ------------------------------------ uint32 uint32 

所以你可以通过包装很多成员来节省空间。

请注意,C标准没有指定位域如何排列或打包在“可寻址存储单元”中。 而且,与直接成员访问相比,位域速度较慢。

这意味着它是一个位域 – 也就是说,可抽取的大小是一个单一的位,你只能分配0或1。 通常用于旧代码以节省空间,或用于与硬件接口的低级代码(即使包装不可移植)。 在这里看到更多的信息

如果我没有记错的话,当在结构中使用时,冒号后面的数字表示variables(或位字段)有多less位组成。

所以unsigned dumpable:1; 是一个单比特的比特字段。