了解 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 处。为了正确对齐,每个数组成员需要从最大元素大小的倍数开始.所以该结构在末尾包含填充以完成此操作。
根据数据对齐概念,我理解 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 处。为了正确对齐,每个数组成员需要从最大元素大小的倍数开始.所以该结构在末尾包含填充以完成此操作。