期望成员之间没有填充是否安全?

b1s*_*sub 2 c struct padding language-lawyer

正如C11草案所述,我可以向这两个人保证:

  1. ...结构对象中可能有未命名的填充,但不是在它的开头.

  2. 结构或联合的末尾可能有未命名的填充.

但是,如果任何两个成员之间的填充是可以接受的,那对我来说是不明确的.这是因为,通过说第二段,标准似乎暗示填充只能在结构或联合的末尾.例如,假设int占用4个字节,

#include <stdio.h>

struct s {
    char c;
    int a;
};

int main(void) {
    printf("%d\n", sizeof(struct s));
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我可以得出结论,在c和之间没有填充a吗?

Sou*_*osh 5

不,你不能断定成员之间没有填充.

第一句话说,

... 结构对象中可能有未命名的填充,但不是在它的开头.

这表明成员中可以填充.实际上并不清楚最终会发生什么.因此,为了清楚起来,第二个引用说

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

并不是说,成员之间不能有填充.这不是唯一的目的,它可能会,也可能不会存在,基于现有成员对齐.

  • @supercat"质量编译器"?这完全是主观的.您对非x86架构有多少经验,其中对齐差异会对性能产生重大影响?在哪里*相同的编译器*可以基于不同的优化选项生成相同结构的不同对齐版本? (2认同)