在C语言中,声明中的冒号表示什么?

46

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

我正在学习一些内核代码,在 Linux 2.4 中遇到了以下行(在 sched.h 文件的 struct mm_struct 结构体中):

unsigned dumpable:1;
这意味着什么?

三进制是基于三个数字的。你想表达的是三元的,虽然它是唯一的三元操作符,但正如约翰所说,它不是它的名称。 - Pete Kirkham
谢谢,我很感激这些更正。由于它与问题无关,我已经将那行全部删除了。 - Tzafrir
4
我认为这个问题应该保留冒号标签,因为像我这样的人可能会使用这个词来尝试了解这个问题的含义,然后再提问。 - Tzafrir
3个回答

59

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

当您想将成员打包到位级别时,可以使用位域。 当结构中有许多标志时,这可以大大减少所使用的内存大小。 例如,如果我们定义一个具有已知数字约束的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的位(bits)可能会排列如下:

                      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标准并不指定位域在“可寻址存储单元”内的排列或压缩方式。此外,与直接成员访问相比,位域速度较慢。


5
感谢你的出色回答!值得明确指出的是,为了便于普通读者理解,这些位域的实现不仅取决于机器,还取决于编译器,使用假设位域在内存中的位置的代码具有高度的不可移植性。 - Tzafrir
1
C99 标准定义当有足够的空间时,位域将相邻放置。"实现可以分配任何可寻址的存储单元,以容纳一个位域。 如果有足够的空间,立即跟在结构中另一个位域后面的位域将被打包进同一单元的相邻位中。" - waynix

5

这意味着它是一个位域 - 也就是说,dumpable的大小为单个位,您只能将0或1分配给它。通常用于旧代码以节省空间,或者用于与硬件接口的低级别代码(尽管打包是不可移植的)。更多信息请参见此处


打包并不一定像你正确指出的那样。通常,位域在4字节边界上对齐。然而,编译器选项会影响这一点。 - GorillaPatch

3

如果我没记错的话,在结构体内使用冒号后面的数字表示变量(或位域)占用的位数。

因此,unsigned dumpable:1; 是一个只有一位的位域。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接