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

时间:2010-07-06 12:05:29

标签: c bit-fields colon

  

可能重复:
  What does ‘unsigned temp:3’ means

我正在学习一些内核代码,并且出现在以下行中(在linux 2.4,sched.h,struct mm_struct中):

unsigned dumpable:1;

这是什么意思?

3 个答案:

答案 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;是一位位域。