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

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

7 голосов
/ 15 января 2010
  • Является ли битовое поле концепцией C или C ++?

  • Можно ли использовать только внутри конструкции? В каких еще местах мы можем их использовать?

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

Я написал небольшую программу, чтобы понять, как использовать битовые поля. Но я думаю, что она работает не так, как ожидалось. Я ожидаю, что размер приведенной ниже структуры будет 1 + 4 + 2 = 7 байт (учитывая, что размер unsigned int равен 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 

Ответы [ 5 ]

11 голосов
/ 15 января 2010

Поскольку a и 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-битном выравнивании.

7 голосов
/ 15 января 2010

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

2) Да или внутри класса в C ++.

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

0 голосов
/ 18 декабря 2017

Битовые поля широко используются во встроенном программном обеспечении для отображения различных полей в регистрах. Это сэкономит много ручных побитовых операций, которые были бы необходимы для чтения / записи полей без него. Недостатком является то, что вы не можете использовать адрес битовых полей.

0 голосов
/ 15 января 2010

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

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

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

0 голосов
/ 15 января 2010

Это C.

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

...