打包结构中的解压结构是否自动打包?
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
成员 c
和 i
之间.
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
应用于结构成员时,它会导致该成员的对齐要求为一个字节。即它消除了先前成员与该成员之间的填充,因为不需要填充来使其对齐。它不会改变成员本身的表示。如果该成员是一个未压缩的结构,它在内部仍然是一个未压缩的结构。)
否 - 打包不是递归的,因此每个成员都需要自己打包。
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 itss
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
成员 c
和 i
之间.
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
应用于结构成员时,它会导致该成员的对齐要求为一个字节。即它消除了先前成员与该成员之间的填充,因为不需要填充来使其对齐。它不会改变成员本身的表示。如果该成员是一个未压缩的结构,它在内部仍然是一个未压缩的结构。)
否 - 打包不是递归的,因此每个成员都需要自己打包。