0

我正在查看有关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的大小不一样?

4

0 回答 0