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

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标准没有规定如何在"可寻址存储单元"内排列或打包位域.此外,与直接成员访问相比,位域较慢.

  • 谢谢你的回答!值得明确注意的是,为了便于读者,这些位字段的实现不仅依赖于机器,而且还依赖于编译器,并且使用内存中这些位的位置假设的代码是非常不可移植的. (5认同)

Air*_*Ltd 5

这意味着它是一个位域 - 即dumpable的大小是一个位,你只能为它分配0或1.通常在旧代码中用于节省空间,或者在与硬件接口的低级代码中使用(即使打包是不可移植的).有关更多信息,请参见此处