В C, что двоеточие означает в объявлении? [дубликат]

42
задан Community 23 May 2017 в 11:46
поделиться

3 ответа

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

56
ответ дан 26 November 2019 в 23:52
поделиться

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

Итак, беззнаковый дамп: 1; - однобитовое поле.

3
ответ дан 26 November 2019 в 23:52
поделиться

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

5
ответ дан 26 November 2019 в 23:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: