Search code examples
csyntaxbit-fields

In C, what does a colon mean inside a declaration?


Possible Duplicate:
What does ‘unsigned temp:3’ means

I'm learning some kernel code, and came along the following line (in linux 2.4, sched.h, struct mm_struct):

unsigned dumpable:1;

What does this mean?


Solution

  • It's a bitfield member. Your code means dumpable occupies exactly 1 bit in the structure.

    Bitfields are used when you want to pack members in bit-level. This can greatly reduce the size of memory used when there are a lot of flags in the structure. For example, if we define a struct having 4 members with known numeric constraint

    0 < a < 20
        b in [0, 1]
    0 < c < 8
    0 < d < 100
    

    then the struct could be declared as

    struct Foo {
       unsigned a : 5;   // 20 < 2^5 = 32
       unsigned b : 1;   // 
       unsigned c : 3;   // 
       unsigned d : 7;   // 100 < 2^7 = 128
    };
    

    then the bits of Foo may be arranged like

                          ddddddd c  cc b aaaaa
    ---------  ---------  ---------  ----------
                           octet 1     octet 0
    ===========================================
                    uint32
    

    instead of

    struct Foo {
       unsigned a;
       unsigned b;
       unsigned c;
       unsigned d;
    };
    

    in which many bits are wasted because of the range of values

    # wasted space which is not used by the program
    # v                                     v
                                 ddddddd                                  ccc
    ------------------------------------ ------------------------------------
                uint32                                 uint32
    
    
                                       b                                aaaaa
    ------------------------------------ ------------------------------------
                uint32                                 uint32
    

    so you can save space by packing many members together.

    Note that the C standard doesn't specify how the bitfields are arranged or packed within an "addressable storage unit". Also, bitfields are slower compared with direct member access.