que*_*ent 6 c c++ gcc struct packed
打包结构中的解包结构是否由 GCC 自动打包?
换句话说,__packed__属性会自动传播到嵌套结构吗?
也就是说:
struct unpackedStruct{
    int16_t field1;
    int32_t field2;
    // etc...
}
struct packedStruct{
    int16_t field1;
    struct unpackedStruct struct1; // <-- Is this struct packed?
    // etc...
} __attribute__((__packed__));
不,内部结构没有包装。在这个 Godbolt 例子中,我们可以看到struct foo里面没有打包struct bar,它有packed属性;struct bar创建的对象.zero   3在其struct foo成员内部、struct foo成员c和之间包含三个字节的填充(可见为)i。
GCC 10.2 的当前文档明确指出打包结构成员的内部布局未打包(因为外部结构上的属性;当然,它可以由于其自己的定义而打包)。
(在较旧的文档中说,应用于packed结构等同于将其应用于其成员,这意味着应用于packed作为成员的“变量”的效果,在变量属性文档中描述。何时packed应用于结构成员,它导致成员的对齐要求为一个字节。也就是说,它消除了先前成员和该成员之间的填充,因为不需要填充来使其对齐。它不会改变成员本身的表示。如果该成员是一个未压缩的结构,它在内部仍然是一个未压缩的结构。)