结构大小问题,声称不需要的内存?

时间:2014-05-30 11:14:01

标签: c gcc structure sizeof bit-fields

#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位字段。

任何想法为什么?

3 个答案:

答案 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。 有编译器特定选项可以关闭填充。但是为了兼容性,不建议使用它们。