我有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
。我不知道为什么会发生这种情况,我很感激有关此事的任何意见。
答案 0 :(得分:6)
这是由于田地的对齐。
第一个内部结构使用uint64_t
作为位域的基础类型,而第二个内部结构使用uint16_t
作为基础类型。
为了使结构整体正确对齐,它必须与最大的基数"所需的偏移对齐。内部字段,在这种情况下是uint64_t
,因此需要8字节对齐。
如果没有这样的对齐,如果创建了这种类型的数组,那么并非所有数组元素都将以8字节偏移量开始。因此,最后添加6个填充字节以确保正确对齐。