我在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字节为int,+ 2字节短+ 2字节短+ 2字节短+ 2字节为短+ 1字节为两个char类型组合+ 3用于对齐= 16个字节。
但sizeof(struct N)是12字节而不是16字节。为什么M和N的大小不相同?