打包结构中的解包结构是否由 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__));
最佳答案
不,内部结构没有包装。在 this Godbolt example ,我们可以看到 struct foo
里面没有包装struct bar
,其中有 packed
属性; struct bar
创建的对象在其 .zero 3
中包含三个字节的填充(可见为 struct foo
)成员(member),在struct foo
之间成员(member)c
和 i
.
Current documentation for GCC 10.2明确表示压缩结构的成员的内部布局未压缩(因为外部结构的属性;当然,它可以由于其自己的定义而被压缩)。
(在 older documentation 中说将 packed
应用到结构上等同于将其应用到其成员上,这意味着将 packed
应用于作为成员的“变量”的效果,在 the documentation for variable attributes 中描述。当packed
应用于结构成员,它导致成员的对齐要求为一个字节。也就是说,它消除了先前成员和该成员之间的填充,因为不需要填充来使其对齐。它不会改变表示成员本身。如果该成员是未压缩的结构,则它在内部仍然是未压缩的结构。)
关于c++ - 打包结构中的解包结构是否自动打包?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66388902/