打包结构中的解压结构是否自动打包?

Are unpacked struct in packed struct automatically 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__));

实际上并没有:参见 https://godbolt.org/z/4YMaz8。请注意 unpackedStruct 成员的两个成员之间的填充 .zero 2

这种情况在manual中有明确提到,并且有一个与你几乎相同的例子:

In the following example struct my_packed_struct’s members are packed closely together, but the internal layout of its s member is not packed—to do that, struct my_unpacked_struct needs to be packed too.

struct my_unpacked_struct
 {
    char c;
    int i;
 };

struct __attribute__ ((__packed__)) my_packed_struct
  {
     char c;
     int  i;
     struct my_unpacked_struct s;
  };

基本思想是给定类型的每个对象都应具有相同的布局,以便在该类型上运行的代码将在该类型的每个对象上运行。因此 packed 必须应用于 类型 ,并且您不能将某些类型的对象打包而另一些则不打包。

不,内部结构没有打包。在this Godbolt example中,我们可以看到struct foo没有被打包在struct bar里面,它具有packed属性;创建的 struct bar 对象在其 struct foo 成员中包含三个字节的填充(显示为 .zero 3),位于 struct foo 成员 ci 之间.

Current documentation for GCC 10.2 明确表示打包结构成员的内部布局未打包(因为外部结构上的属性;当然,由于其自​​己的定义,它可以打包)。

(在older documentation that said that applying packed to a structure is equivalent to applying it to its members, it meant the effect of applying packed to the “variable” that is the member, described in the documentation for variable attributes中。当packed应用于结构成员时,它会导致该成员的对齐要求为一个字节。即它消除了先前成员与该成员之间的填充,因为不需要填充来使其对齐。它不会改变成员本身的表示。如果该成员是一个未压缩的结构,它在内部仍然是一个未压缩的结构。)

否 - 打包不是递归的,因此每个成员都需要自己打包。