什么时候结构没有填充?

use*_*671 6 c

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

struct s {
    short c;
} x;
Run Code Online (Sandbox Code Playgroud)

但对于结构

struct s {
    short c;
    char a;
} x;
Run Code Online (Sandbox Code Playgroud)

sizeof(x)回来4,为什么?

第二个获取一个填充字节(假设short为2个字节长,char为1个字节长).第一个结构不应该有2个填充字节(因此长度为4个字节)?

Eri*_*hil 5

填充的主要用途是根据硬件(或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;结构也始终布局,因此可以在数组中使用它.