我有一个看起来像下面这样的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
。我不知道为什么会这样,如果您能就此事提供任何意见,我将不胜感激。
最佳答案
这是由于字段的对齐。
第一个内部结构使用 uint64_t
作为位域的底层类型,而第二个内部结构使用 uint16_t
作为底层类型。
为了使结构作为一个整体正确对齐,它必须与最大“基本”内部字段所需的偏移量对齐,在本例中为 uint64_t
因此需要 8 字节对齐。
如果没有这种对齐方式,如果创建了这种类型的数组,则并非所有数组元素都将从 8 字节偏移量开始。所以在末尾添加了 6 个填充字节以确保正确对齐。
关于c - 包含包含位域的结构的结构的大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38443892/