包含包含位域的结构的结构的大小

时间:2016-07-18 18:42:15

标签: c struct

我有struct,如下所示:

typedef unsigned __int16 UINT16;
typedef unsigned __int64 UINT64;

struct Example {
    struct {
        UINT64 var1 : 5;
        UINT64 var2 : 2;
        UINT64 var3 : 29;
        UINT64 var4 : 23;
        UINT64      : 5;
    };
    struct {
        UINT16 var5 : 4;
        UINT16 var6 : 2;
        UINT16      : 10;
    };
};

我希望sizeof(struct Example)返回10,但它返回16。我不知道为什么会发生这种情况,我很感激有关此事的任何意见。

1 个答案:

答案 0 :(得分:6)

这是由于田地的对齐。

第一个内部结构使用uint64_t作为位域的基础类型,而第二个内部结构使用uint16_t作为基础类型。

为了使结构整体正确对齐,它必须与最大的基数"所需的偏移对齐。内部字段,在这种情况下是uint64_t,因此需要8字节对齐。

如果没有这样的对齐,如果创建了这种类型的数组,那么并非所有数组元素都将以8字节偏移量开始。因此,最后添加6个填充字节以确保正确对齐。