В C, что означает двоеточие внутри декларации?

Возможный дубликат:
Что делает & lsquo; unsigned temp: 3 & rsquo; означает

Я изучаю код ядра и приходил по следующей строке (в Linux 2.4, sched.h, struct mm_struct):

unsigned dumpable:1;

Что это значит?

Ответ 1

Это член 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 не указывается, как битовые поля расположены или упакованы в "адресный блок хранения". Кроме того, битовые поля медленнее по сравнению с прямым доступом членов.

Ответ 2

Это означает, что бит бит - т.е. размер dumpable - это один бит, и вы можете назначить ему только 0 или 1. Обычно используется в старом коде для экономии места или в низкоуровневом коде, который взаимодействует с оборудованием (даже если упаковка не переносима). См. здесь для получения дополнительной информации

Ответ 3

Если я правильно помню, когда используется внутри структуры, число после двоеточия означает, сколько битов составляет переменную (или битовое поле).

Итак unsigned dumpable:1; - однобитовое битовое поле.