Размер структуры - отступы и выравнивание - PullRequest
0 голосов
/ 13 апреля 2020

У меня есть явно заданная структура:

typedef struct
{
    unsigned long                   A : 4;
    unsigned long                   B : 12;
    union
    {
        unsigned long               C1 : 8;
        unsigned long               C2 : 8;
        unsigned long               C3 : 8;
    };
    unsigned long                   D : 8;
}FooStruct;

Общий размер этой структуры в теории должен составлять 32 бита (4 байта). Тем не менее, я получаю 12-байтовый размер, используя sizeof, поэтому здесь должно произойти некоторое заполнение и выравнивание.

Я просто не понимаю, почему и где. Может кто-нибудь объяснить мне, как эта структура занимает 12 байтов в памяти?

Ответы [ 2 ]

2 голосов
/ 13 апреля 2020

Объединение инициирует начало новой неподписанной длинной, а член после объединения - еще одну неподписанную длинную. Предполагая, что long равен 4 байта, это означает, что ваша структура будет иметь 3 беззнаковых long в общей сложности 12 байтов. Хотя объединение с тремя равными по размеру членами также кажется странным.

Если вы хотите, чтобы он имел размер 4 байта, почему бы не изменить его на:

typedef struct
{
    unsigned short                   A : 4;
    unsigned short                   B : 12;

    union
    {
        unsigned char               C1 : 8;
        unsigned char               C2 : 8;
        unsigned char               C3 : 8;
    };

    unsigned char                   D : 8;
}FooStruct;
1 голос
/ 13 апреля 2020

Кроме того, если вы используете g cc и хотите отключить заполнение структуры, вы можете использовать __attribute__((packed)):

struct FooStruct
{
    unsigned long                   A : 4;
    unsigned long                   B : 12;
    union
    {
        unsigned long               C1 : 8;
        unsigned long               C2 : 8;
        unsigned long               C3 : 8;
    } __attribute__((packed)) C;
    unsigned long                   D : 8;
} __attribute__((packed));

Но учтите, что некоторые архитектуры могут иметь штрафы за доступ к данным без выравнивания или не разрешать это вообще.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...