具有位字段的结构的大小不是预期的

时间:2018-03-21 00:51:59

标签: c structure tdm-gcc

我在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的大小不相同?

0 个答案:

没有答案