我正在查看有关link1 link2等位字段的几篇 SO 帖子。我正在使用 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 个字节。这意味着,字符和整数将被分开考虑,即使整数是位字段类型并且有可用空间,char 也不会放在整数空间中。同样,整个结构与 sizeof(int) 的边界对齐,因此在 P 的情况下总大小将为 4+1+3 个填充字节。如果我使用#pragma pack(1),我得到 9 个字节,而整数现在不是自然对齐,并且整个结构都被打包成不对齐整数类型的边界。
考虑到相同的概念,我期望 sizeof(struct N) 为 [4 byte for int, + 2 byte short + 2 byte short + 2 byte short + 2 byte for short + 1 byte for two char type combination + 3 for alignment = 16 个字节。
但是 sizeof(struct N) 是 12 字节而不是 16 字节。为什么M和N的大小不一样?