Можно создать дубликат:
What does ‘unsigned temp:3’ meansВ C, что означает двоеточие внутри декларации?
Я учусь код ядра, и пришел к следующей строке (в Linux 2.4, sched.h, структура mm_struct):
unsigned dumpable:1;
Что это значит?
Можно создать дубликат:
What does ‘unsigned temp:3’ meansВ C, что означает двоеточие внутри декларации?
Я учусь код ядра, и пришел к следующей строке (в Linux 2.4, sched.h, структура mm_struct):
unsigned dumpable: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 не указывается, как битовые поля расположены или упакованы в «адресную единицу хранения». Кроме того, битподы медленнее по сравнению с прямым доступом членов.
Спасибо за отличный ответ! Стоит прямо отметить, что для случайного читателя реализация этих битовых полей не только зависит от машины, но и зависит от компилятора, а код, который использует предположения о расположении этих бит в памяти, крайне неспособен. – Tzafrir
C99 Standard определяет, что битовые поля расположены рядом друг с другом, когда доступно достаточно места. «Реализация может выделять любой адресный блок хранения, достаточно большой для хранения битового поля. Если достаточно места, бит-поле, которое сразу же следует за другим битовым полем в структуре , должно быть упаковано в соседние биты того же блока». – waynix
Это означает, что это битполе - т. Е. Размер dumpable - это один бит, и вы можете назначать ему только 0 или 1. Обычно используется в старом коде для экономии места или в низкоуровневом коде, который взаимодействует с оборудованием (даже если упаковка не переносима). См. here для получения дополнительной информации
Упаковка не обязательно, как кажется, как вы правильно указываете. Часто битовые поля выравниваются с границами 4 байта. Однако есть варианты компилятора, которые влияют на это. – GorillaPatch
Если я правильно помню, когда используется внутри структуры, число после двоеточия означает, сколько битов составляет переменную (или битовое поле).
Таким образом, unsigned dumpable:1;
представляет собой однобитовое битовое поле.
trinary базовый три. Вы имели в виду троянец, и хотя это единственный троичный оператор, как утверждает Джон, это не его имя. –
Спасибо, я ценю эти исправления. Я удалил эту строку в целом из моего вопроса, поскольку это не имело значения. – Tzafrir
Я считаю, что тег двоеточия должен оставаться на этом вопросе, поскольку другие могут, как и я, использовать это слово, чтобы попытаться выяснить, что это значит, прежде чем спрашивать. – Tzafrir