#include <stdio.h>
int main()
{
struct {
int a : 1; // bit field sized 1
double b;
}structVar;
//structVar.a = 10;
printf("%d",sizeof(structVar));
}
在linux机器上的gcc编译器中,structVar的大小为16。 据我说,它应该是9. 8表示双倍,1表示int位字段。
任何想法为什么?
答案 0 :(得分:2)
结构与其最大成员的大小对齐(并填充) - 在这种情况下,为sizeof(double)
。这是预期的(尽管标准不要求)且可预测。如果第二个成员是int,short或者其他什么都没关系 - 只要它小于double,sizeof struct就是16。
结构填料可能会减小结构尺寸。例如。 gcc允许#pragma pack(n)
为后续结构设置新的对齐方式,因此对齐4将为12个字节。
原因是,如果你有这种结构的数组,第二个结构将是未对齐的。它可能会在某些CPU上出现性能命中甚至失败。
答案 1 :(得分:1)
最有可能的原因是双重要求的8字节对齐,如评论所述。但无论如何,这完全是实现定义的(这就是为什么sizeof首先存在)。
答案 2 :(得分:1)
这是因为填充。 double必须以8个字节对齐。因此,额外的7个字节和7位被填充到这个结构中。
您可以参考此link。 有编译器特定选项可以关闭填充。但是为了兼容性,不建议使用它们。