首页 > 解决方案 > 什么时候结构没有填充?

问题描述

sizeof(x)为下面的结构返回 2

struct s {
    short c;
} x;

但对于结构

struct s {
    short c;
    char a;
} x;

sizeof(x)退货4,为什么?

第二个得到一个填充字节(假设 short 是 2 个字节长,char 是 1 个字节长)。那么第一个结构不应该有 2 个填充字节(因此是 4 个字节长)吗?

标签: c

解决方案


填充的主要用途是根据硬件(或 C 实现的其他方面)的要求对齐结构成员。用于在结构中布局数据的算法在这个答案中。

要回答标题中的问题,结构什么时候没有填充:如果每个成员的对齐要求是所有先前成员的总大小和所有成员的总大小的除数,则结构不需要填充对齐。(AC 实现可能仍会出于对齐以外的原因添加填充,但这有点不寻常。)

对于您的示例,假设在 C 实现short中,大小为两个字节并且需要两个字节对齐。根据定义,char是一个字节并且需要一字节对齐。

然后,在struct s {short c;}

  • c放在开头struct。一开始从来没有任何填充。
  • 如果我们创建一个这些数组struct,下一个struct s将比第一个开始两个字节,并且它的成员c仍然是两个字节的倍数,所以它是正确对齐的。
  • 因此,我们不需要任何填充来完成这项工作。

相比之下,在struct s {short c; char a;}

  • c放在开头。
  • a后放置两个字节c。这很好,因为a只需要一个字节对齐。
  • 如果我们不添加任何填充,则大小struct为三个字节。然后,如果我们创建一个这些数组struct,下一个struct s将从开始的三个字节开始。
  • 在那一秒struct s内,该c成员将位于三个字节的偏移量处。这违反了short.
  • 因此,要完成这项struct工作,我们必须添加一个字节的填充。这使得总大小为四个字节。然后,在这些数组中struct,所有成员都将位于对齐所需的边界。

即使你只声明一个结构的单个对象,如在 中struct s {short c; char a;} x;,结构总是被布置以便它可以在数组中使用。


推荐阅读