如果结构中只包含字符,是否有填充?

jes*_*tro 0 c

struct dummy {
    unsigned char a;
    unsigned char b;
    unsigned char c;
};
Run Code Online (Sandbox Code Playgroud)

这是否会导致在任何情况下添加填充?

pax*_*blo 6

虽然这很不寻常,但实现本身决定该结构是否有填充,而不是标准(在本例中为 C11)。

该标准在6.7.2.1 Structure and union specifiers(仅显示相关段落)中指出:

14/ 结构或联合对象的每个非位域成员以适合其类型的实现定义方式对齐。

15/ 在结构体对象中,非位域成员和位域所在的单元的地址按照声明的顺序递增。指向结构对象的指针经过适当转换后,指向其初始成员(或者如果该成员是位字段,则指向它所在的单元),反之亦然。结构对象内可能有未命名的填充,但不是在其开头。

17/ 结构或联合的末尾可能有未命名的填充。

所以:

  • 实现定义了对齐方式,因此定义了填充(来自14)。
  • 开始时没有填充,但成员之间允许填充(从15)。没有什么只允许出于对齐原因进行填充,任何目的都允许填充,包括“实现者的突发奇想”。唯一的要求是地址随着后续成员的增加而增加,而不是根据其大小和对齐方式以尽可能小的数量增加。
  • 17出于任何原因,在最后一个成员(来自 )之后允许再次填充。