Размер структуры с битовыми полями

Здесь у меня есть фрагмент кода.

#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;

Вот что вы говорите компилятору: возьмите необходимое число ints, и ссылаются на бит 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 и т. Д.

Это просто округляет до того, что нравится процессору. (Держите работника счастливым)

Другие вопросы по тегам