【问题标题】:In C, what does a colon mean inside a declaration? [duplicate]在 C 中,声明中的冒号是什么意思? [复制]
【发布时间】:2011-03-12 06:57:29
【问题描述】:

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

我正在学习一些内核代码,结果如下(在 linux 2.4 中,sched.h,struct mm_struct):

unsigned dumpable:1;

这是什么意思?

【问题讨论】:

  • 三进制是三进制。你的意思是三元,虽然它是唯一的三元运算符,但正如约翰所说,这不是它的名字。
  • 谢谢,感谢这些更正。我从我的问题中完全删除了该行,因为它不相关。
  • 我认为冒号标签应该保留在这个问题上,因为其他人可能会像我一样使用这个词来尝试在提问之前找出这意味着什么。

标签: c bit-fields colon


【解决方案1】:

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

所以unsigned dumpable:1; 是一个位域。

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 感谢您的精彩回答!值得注意的是,对于普通读者来说,这些位域的实现不仅依赖于机器,还依赖于编译器,并且对这些位在内存中的位置进行假设的代码是高度不可移植的。跨度>
    • C99 标准定义当有足够空间可用时,位域彼此相邻放置。 “一个实现可以分配任何足够大的可寻址存储单元来保存一个位域。如果有足够的空间,结构中紧跟另一个位域的位域应该被打包到同一单元的相邻位中。”
    【解决方案3】:

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

    【讨论】:

    • 包装不一定如您正确指出的那样。通常位域在 4 字节边界处对齐。然而,有一些编译器选项会影响这一点。
    猜你喜欢
    • 2018-11-21
    • 1970-01-01
    • 2011-01-17
    • 2016-12-23
    • 2017-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多