理解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个字节可以在声明时用于分配给另一个短int,对吗?

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

x的情况下,它包含一个大小为8的double。这意味着结构作为一个整体需要是该大小的倍数,以便x的阵列被适当地对准。

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

最新更新