Размер структуры с битовыми полями
Здесь у меня есть фрагмент кода.
#include <stdio.h>
int main()
{
struct value
{
int bit1 : 1;
int bit2 : 4;
int bit3 : 4;
} bit;
printf("%d",sizeof(bit));
return 0;
}
Я получаю вывод как 4 (32-битный компилятор). Может кто-нибудь объяснить мне, как? Почему это не 1+ 4 + 4 = 9? Я никогда раньше не работал с битовыми полями, поэтому хотел бы помочь. Спасибо.:)
3 ответа
Когда вы говорите компилятору C это:
int bit1 : 1
Он интерпретирует его как целое число и выделяет его; но относится к этому в первую очередь как bit1
,
Итак, если мы рассмотрим ваш код:
struct value
{
int bit1 : 1;
int bit2 : 4;
int bit3 : 4;
} bit;
Вот что вы говорите компилятору: возьмите необходимое число int
s, и ссылаются на бит 1 фрагментов как bit1
, затем обратитесь к битам 2 - 5 как bit2
и затем обратитесь к битам 6 - 9 как bit3
,
Поскольку полное число битов, необходимых 9, и int
32 бита (в архитектуре вашего компьютера), объем памяти только 1 int
необходимо. Таким образом, вы получите размер 4 (байта).
Вместо этого, если вы должны были определить struct
с помощью char
с, так как char
равняется 8 битам, компилятор выделил бы пространство памяти двух char
для каждого struct value
, И вы получите 2 (байта) в качестве вывода.
Потому что C просит упаковать биты в один и тот же модуль (здесь один signed int
/ unsigned int
):
(C99, 6.7.2.1p10) "Если остается достаточно места, битовое поле, которое непосредственно следует за другим битовым полем в структуре, должно быть упаковано в смежные биты той же единицы"
Процессору просто нравится собирать 32 бита за один раз, а не 9, 34 и т. Д.
Это просто округляет до того, что нравится процессору. (Держите работника счастливым)