了解 C 中的结构填充

Understanding Structure Padding in C

根据数据对齐概念,我理解 int 和 float 应该存储在可被 4 整除的地址(起始字节地址)。根据它,以下结构的大小为 12

 typedef struct{
    char A;
    int B;
    float C;
}y;

我对上述结构的大小毫无疑问 现在我怀疑下面结构的大小

typedef struct {
    double A;
    char B;
    char C;
}x;

x的大小是16。我怀疑使用的两个字符可以分配2个字节,这样整个结构使用10个字节的数据 剩下的 2 个字节在声明时可以用来分配给另一个 short int 吗?

但是编译器使用了 16 个字节的数据并填充了其他 6 个单元格。我不明白为什么它会浪费另外 6 个单元格,如果它在声明它们时可以将它们用于另一个变量?。任何人都可以帮助我理解上述概念吗?(我假设 int、float 和 double 的大小分别为 4、4、8 字节。)

x 的情况下,它包含一个 double,其中(在您的情况下)大小为 8。这意味着整个结构需要是该大小的倍数为了使 x 的数组正确对齐。

由于数组是连续分配的,因此数组的每个成员在内存中紧跟在前一个成员之后。如果 x 的大小为 10,则对于数组,第二个元素的 A 成员将位于偏移量 10 处。为了正确对齐,每个数组成员需要从最大元素大小的倍数开始.所以该结构在末尾包含填充以完成此操作。