c++ - 打包结构中的解包结构是否自动打包?

标签 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__));

最佳答案

不,内部结构没有包装。在 this Godbolt example ,我们可以看到 struct foo里面没有包装struct bar ,其中有 packed属性; struct bar创建的对象在其 .zero 3 中包含三个字节的填充(可见为 struct foo )成员(member),在struct foo之间成员(member)ci .
Current documentation for GCC 10.2明确表示压缩结构的成员的内部布局未压缩(因为外部结构的属性;当然,它可以由于其自己的定义而被压缩)。
(在 older documentation 中说将 packed 应用到结构上等同于将其应用到其成员上,这意味着将 packed 应用于作为成员的“变量”的效果,在 the documentation for variable attributes 中描述。当packed 应用于结构成员,它导致成员的对齐要求为一个字节。也就是说,它消除了先前成员和该成员之间的填充,因为不需要填充来使其对齐。它不会改变表示成员本身。如果该成员是未压缩的结构,则它在内部仍然是未压缩的结构。)

关于c++ - 打包结构中的解包结构是否自动打包?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66388902/

相关文章:

c - 在 C 中的浏览器中生成按键

我根本找不到C内存泄漏

c++ - gcc - 删除 "is used uninitialized in this function"警告

linux - 助记符中的无效字符(0xe2)

c - 如何从多个源生成单个 LLVM IR

C++:覆盖公共(public)\私有(private)继承

java - 将 C++ 库转换为 .so/.dll 共享库

c++ - QMediaPlayer 在 QtCreator 外部启动时无法在 Windows 上开始播放

c++ - 通过继承扩展 shared_ptr

c - 通过在编译时替换静态符号来测试嵌入式代码