即使使用填充,sizeof结构也不清晰

时间:2014-05-19 05:14:23

标签: c++

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

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

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

3 个答案:

答案 0 :(得分:6)

这样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的结尾不是对象的结尾。

答案 1 :(得分:1)

在像这样的POD结构中,struct的地址是其第一个元素的地址。大小是类型X[]的数组的连续元素之间的内存距离。要使double在假设数组的第二个元素中对齐,第一个int和整个struct必须与double的严格程度相对应。这需要在最后填充。

答案 2 :(得分:0)

您在哪个平台上运行?在我的ubuntu机器上它只给我输出20! sizeof unsigned int为4,double为8,这就是我的机器上输出为20 的原因 !! 这从硬件到硬件各不相同!!