Вопросы о битовых полях C

  • Действительно ли битовое поле является понятием C или C++?

  • Это может использоваться только в структуре? Каковы другие места, мы можем использовать их?

  • AFAIK, битовые поля являются специальными переменными структуры, которые занимают память только для указанного нет. из битов. Это полезно в сохранении памяти и ничего иного. Я корректен?

Я кодировал небольшую программу для понимания использования битовых полей - Но, я думаю, что оно не работает как ожидалось. Я ожидаю, что размер ниже структуры будет 1+4+2 = 7 байтов (рассмотрение, что размер неподписанного интервала составляет 4 байта на моей машине), Но к моему удивлению это оказывается 12 байтами (4+4+4). Кто-либо может сообщить мне почему?

#include <stdio.h>

struct s{
unsigned int a:1;
unsigned int b;
unsigned int c:2;
};

int main()
{
  printf("sizeof struct s = %d bytes \n",sizeof(struct s));
  return 0;
}

ВЫВОД:

sizeof struct s = 12 bytes 
8
задан Donal Fellows 6 July 2010 в 14:52
поделиться

4 ответа

Похоже, вы слишком плотно интегрируете слои. Обычно в этом типе ситуации я бы позволил презентационному слою решить реализацию getDisplayName () вместо того, чтобы сделать его расширением самого свойства. Вы можете создать интерфейс под названием MyTypedisPlayer или что угодно, и пусть будет несколько реализаций, не ограничивая вас к одной реализации дисплея.

-121--4482040-

1) Они возникли в C, но являются частью C ++, к сожалению, к сожалению.

2) Да или в классе в C ++.

3), а также экономия памяти, их можно использовать для некоторых форм битового Twiddling. Тем не менее, как сохранение памяти, так и для TwidDling по своей природе зависит от реализации - если вы хотите написать портативное программное обеспечение, избегать полей битов.

8
ответ дан 5 December 2019 в 08:24
поделиться

Это C.

Ваш Comiler округлил распределение памяти до 12 байтов для целей выравнивания. Большинство Syubsystems Memory Memory не могут обрабатывать адресацию байта.

0
ответ дан 5 December 2019 в 08:24
поделиться

Разве вы не можете просто изменить тип левой_уп, чтобы быть Bool?

Глядя на ваш код и то, как вы используете Eventthief, вы можете использовать перечисление флага, чтобы вы могли установить отдельные биты и Тогда делайте побитовые сравнения.

-121--4196147-

Поскольку A и C C C C не являются смежными, они каждый резервирует, что стоимость памяти полной int. Если вы переместите A и C вместе, размер структуры становится 8 байт.

Более того, вы говорите компилятору, что вы хотите A , чтобы занять только 1 бит , а не 1 байт. Таким образом, хотя A и C рядом друг с другом следует занимать только 3 бита (все еще под одним байтом), комбинация A и C Все еще становится выровненным в слов в памяти на вашем 32-битной машине, поэтому занимает полный 4 байта в дополнение к INT B .

Точно так же вы обнаружите, что

struct s{
unsigned int b;
short s1;
short s2;
};

занимают 8 байтов, а

struct s{
short s1;
unsigned int b;
short s2;
};

занимает 12 байтов, потому что в последнем случае два шорты каждый сидят в своем собственном 32-разрядном выравнивании.

12
ответ дан 5 December 2019 в 08:24
поделиться

Ваша программа работает именно так, как я ожидаю. Компилятор выделяет прилегающие билетные поля в одно и то же слово памяти, но ваши отделены нецитором.

Переместите билетные поля рядом друг с другом, и вы, вероятно, получите 8, что размер двух INT на вашем компьютере. Битфилдс будет упакован в один int. Однако это компилятор, однако.

Битовые поля полезны для экономии места, но не сильно.

0
ответ дан 5 December 2019 в 08:24
поделиться
Другие вопросы по тегам:

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