2010-07-06 8 views
36

Можно создать дубликат:
What does ‘unsigned temp:3’ meansВ C, что означает двоеточие внутри декларации?

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

unsigned dumpable:1; 

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

+0

trinary базовый три. Вы имели в виду троянец, и хотя это единственный троичный оператор, как утверждает Джон, это не его имя. –

+0

Спасибо, я ценю эти исправления. Я удалил эту строку в целом из моего вопроса, поскольку это не имело значения. – Tzafrir

+4

Я считаю, что тег двоеточия должен оставаться на этом вопросе, поскольку другие могут, как и я, использовать это слово, чтобы попытаться выяснить, что это значит, прежде чем спрашивать. – Tzafrir

ответ

53

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

+5

Спасибо за отличный ответ! Стоит прямо отметить, что для случайного читателя реализация этих битовых полей не только зависит от машины, но и зависит от компилятора, а код, который использует предположения о расположении этих бит в памяти, крайне неспособен. – Tzafrir

+1

C99 Standard определяет, что битовые поля расположены рядом друг с другом, когда доступно достаточно места. «Реализация может выделять любой адресный блок хранения, достаточно большой для хранения битового поля. Если достаточно места, бит-поле, которое сразу же следует за другим битовым полем в структуре , должно быть упаковано в соседние биты того же блока». – waynix

5

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

+0

Упаковка не обязательно, как кажется, как вы правильно указываете. Часто битовые поля выравниваются с границами 4 байта. Однако есть варианты компилятора, которые влияют на это. – GorillaPatch

3

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

Таким образом, unsigned dumpable:1; представляет собой однобитовое битовое поле.

Смежные вопросы