Размер структуры с битовым полем не такой, как ожидалось
Я просматривал несколько 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 не совпадают?