通过数据对齐概念,我了解到int和floats应该存储在可被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字节。)
答案 0 :(得分:3)
对于x
,它包含一个double
,该x
(以您的情况为例)的大小为8。这意味着,整个结构需要为该大小的倍数,以便x
的数组以正确对齐。
由于数组是连续分配的,因此数组中的每个成员紧随内存中的前一个之后。如果A
的大小为10,则对于一个数组,第二个元素的Session
成员的偏移量为10。为了正确对齐,每个数组成员都必须以最大元素的大小的倍数开始。因此,结构的末尾包含填充以完成此操作。