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

标签 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。我不知道为什么会这样,如果您能就此事提供任何意见,我将不胜感激。

最佳答案

这是由于字段的对齐。

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

为了使结构作为一个整体正确对齐,它必须与最大“基本”内部字段所需的偏移量对齐,在本例中为 uint64_t因此需要 8 字节对齐。

如果没有这种对齐方式,如果创建了这种类型的数组,则并非所有数组元素都将从 8 字节偏移量开始。所以在末尾添加了 6 个填充字节以确保正确对齐。

关于c - 包含包含位域的结构的结构的大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38443892/

相关文章:

c++ - 在数组声明中使用常量结构成员

c - doxygen 将宏类型错误渲染为公共(public)成员函数

在不知道语言的情况下大小写 UTF-8

一次复制 8 个字节的结构

c - "Expected declaration before ' struct ' "声明函数时?

c - 'struct' 之前的预期表达式

c - C99 中固定大小的指针类型

c - 如何在 C 中打开文件到标准输出并追加

无法读取文件

c - 交换双链表中的节点 - 慢速排序算法丢弃节点