struct unaming
{
char f;
double dd;
struct
{
int data;
char c;
double d;
};
};
我期望此结构的大小为40个字节。但是编译器返回了32个字节。 我期待着以下布局。
[char f] [7字节] [double dd] [int数据] [4字节] [char c] [7bytes] [double d] = 40
这是基于以下规则:结构及其成员变量将与当前存在的最大数据类型对齐。
但是看起来编译器重新排列了未修饰的结构。是这样吗为什么是32个字节?
答案 0 :(得分:6)
规则不是每个结构构件都必须根据结构中构件的最大对齐要求进行对齐。规则是每个成员必须根据自己的对齐要求进行对齐。
对于您的结构,假设char
,int
和double
的大小分别为1、4和8个字节,并假定其对齐要求也为1、4和8个字节,典型的C实现中的布局为:
char f
的偏移量为0。double
所需的8。double dd
位于偏移量8。struct
从偏移量16开始。int data
位于偏移量16。char c
位于偏移量20。double
所需的三个填充字节使offset达到24。double d
位于偏移量24。这使得总大小为32个字节。由于这是八的倍数,因此最后不需要填充。 (由于结构可以在数组中使用,因此结构的总大小必须是其对齐要求的倍数,以便数组中的后续结构可以位于所需的对齐边界上。)