Действительно ли битовое поле является понятием 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
Похоже, вы слишком плотно интегрируете слои. Обычно в этом типе ситуации я бы позволил презентационному слою решить реализацию getDisplayName ()
вместо того, чтобы сделать его расширением самого свойства. Вы можете создать интерфейс под названием MyTypedisPlayer
или что угодно, и пусть будет несколько реализаций, не ограничивая вас к одной реализации дисплея.
1) Они возникли в C, но являются частью C ++, к сожалению, к сожалению.
2) Да или в классе в C ++.
3), а также экономия памяти, их можно использовать для некоторых форм битового Twiddling. Тем не менее, как сохранение памяти, так и для TwidDling по своей природе зависит от реализации - если вы хотите написать портативное программное обеспечение, избегать полей битов.
Это C.
Ваш Comiler округлил распределение памяти до 12 байтов для целей выравнивания. Большинство Syubsystems Memory Memory не могут обрабатывать адресацию байта.
Разве вы не можете просто изменить тип левой_уп, чтобы быть 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-разрядном выравнивании.
Ваша программа работает именно так, как я ожидаю. Компилятор выделяет прилегающие билетные поля в одно и то же слово памяти, но ваши отделены нецитором.
Переместите билетные поля рядом друг с другом, и вы, вероятно, получите 8, что размер двух INT на вашем компьютере. Битфилдс будет упакован в один int. Однако это компилятор, однако.
Битовые поля полезны для экономии места, но не сильно.