45

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

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

unsigned dumpable:1;

这是什么意思?

4

3 回答 3

58

它是一个位域成员。您的代码意味着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 标准没有指定位域在“可寻址存储单元”中的排列或打包方式。此外,与直接成员访问相比,位域更慢。

于 2010-07-06T12:06:46.240 回答
5

这意味着它是一个位域——即dumpable 的大小是一个位,您只能为其分配0 或1。通常用于旧代码以节省空间,或用于与硬件接口的低级代码(即使打包是不可移植的)。请参阅此处了解更多信息

于 2010-07-06T12:07:21.883 回答
3

如果我没记错的话,当在结构内部使用时,冒号后面的数字表示有多少位组成变量(或位域)。

unsigned dumpable:1;单个位域也是如此。

于 2010-07-06T12:08:30.053 回答