Размер структуры с битовым полем не такой, как ожидалось

Я просматривал несколько SO-сообщений о битовых полях, таких как link1 link2. Я использую компилятор TDM-GCC-64. В приведенном ниже коде, чтобы проверить размер структур при различных сценариях.

#include <stdio.h>

struct P
{
    int k:2;
    char c:1;
};

struct Q
{
    int k:2;
    short c:1;
};

#pragma pack(1)
struct R
{
    int k:2;
    char c:1;
    int a;
};
#pragma pack()


struct M {
    int m;
    short l;
    short k;
    short x;
    short n:2;
    char a:2;
    char c:2;
};

struct N {
    int m:2;
    short l;
    short k;
    short x;
    short n:2;
    char a:2;
    char c:2;
};


int main()
{
    printf("sizeof struct P = %d\n",sizeof(struct P));
    printf("sizeof struct Q = %d\n",sizeof(struct Q));
    printf("sizeof struct R = %d\n",sizeof(struct R));
    printf("sizeof struct M = %d\n",sizeof(struct M));
    printf("sizeof struct N = %d\n",sizeof(struct N));
    return 0;
}

Я получаю sizeof(struct P) и sizeof(struct Q) как 8 байтов. Это означает, что символ и целые числа будут рассматриваться отдельно, и символ не будет помещен в целочисленное пространство, даже если целое число имеет тип битового поля и свободное пространство доступно. Снова вся структура выровнена по границе sizeof(int), и, следовательно, общий размер будет 4+1+3 байта заполнения в случае P. Если я использую #pragma pack(1), я получаю 9 байтов, а целые числа теперь не естественно выровненный, а также вся структура упакована и не выровнена по границе целочисленного типа.

Учитывая ту же концепцию, я ожидал, что sizeof(struct N) будет [4 байта для int, + 2 байта short + 2 байта short + 2 байта short + 2 байта для short + 1 байт для двух типов символов, объединенных + 3 для выравнивания = 16 байт.

Но sizeof (структура N) составляет 12 байтов, а не 16 байтов. Почему размеры М и N не совпадают?

0 ответов

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