结构体的大小即使有填充也不清楚

Sizeof struct is not clear even with padding

本文关键字:填充 不清楚 结构体      更新时间:2023-10-16

在下面的结构体中,我觉得大小应该是20,但结果是24。

class X {
  unsigned int a;
  unsigned int b;
  double       c;
  unsigned int d;
};

为什么编译器不能从16-20字节排列d ?

这是为了使cX的数组中保持在8字节边界上对齐。

X x[2];
X[0]:
0-3    unsigned int a
4-7    unsigned int b
8-15   double       c
16-19  unsigned int d
20-23  [PAD]
X[1]:
24-27    unsigned int a
28-31    unsigned int b
32-39   double       c
40-43  unsigned int d
44-47  [PAD]

因此,您可以看到在数组元素之间需要4字节的填充。这是通过在对象的末尾添加4字节来捕获的。如果第二个数组元素从位置20开始,那么您会发现x[1].c不是8字节对齐的。

所以,最后,d确实从第16字节开始,但d的结束不是对象的结束。

在这样的POD结构中,struct的地址是它的第一个元素的地址。size是类型为X[]的数组中连续元素之间在内存中的距离。为了使double在假设数组的第二个元素中对齐,第一个int和整个struct必须按照与double相同的严格度对齐。

您在哪个平台上运行?在我的ubuntu机器上,它只给我输出20 !!sizeof unsigned int是4,double是8,这就是为什么在我的机器上输出的是20 !!这因硬件而异!!