__attribute __((packed))对嵌套结构数组的影响?

时间:2011-10-31 17:34:53

标签: c arrays gcc attributes struct

1 个答案:

答案 0 :(得分:22)

请注意关于__attribute__((packed))的以下几点:

  • 在结构声明中使用packed时,它会压缩其字段,例如sizeof(structure)== sizeof(first_member)+ ... + sizeof(last_member)。< / p>

  • 这里,数组只是结构的一个成员。打包数组的包含结构不会改变数组的大小。实际上,(任意)数组的大小总是 sizeof(元素)* number_of_elements。

  • 类似地,包装内部结构的包含结构不会改变内部结构的尺寸。结构的大小完全取决于其声明,无论您在何处使用,都是相同的。

  • 打包一个结构会使其所需的对齐方式为一个字节(即它可以放在内存中的任何位置)。

  • 在访问打包结构的字段时,打包将引入对齐问题。编译器将在直接访问字段时考虑到这一点,但不是通过指针访问时。当然,这不适用于具有所需对齐的字段(例如char或其他打包结构)。请参阅my answer to a similar question,其中包含一个程序,用于演示通过指针访问成员的问题。

最后,回答这个问题,

  

有没有办法保证data_s结构会有   绝对没有额外的空间添加到它或它的任何   子结构,所以我没有内存中的编译器相关的移位   地图吗?

是。将结构声明为packed,以及它包含的所有结构,递归。

另请注意,packed属性适用于结构声明,而不适用于类型。 没有声明为非打包的结构的打包版本。当你在某个地方使用一个结构时,它(它的成员)将被打包,当且仅当结构本身被声明为打包时。结构的大小完全取决于其声明,这就暗示了这一点。

更新:出于某种原因,您仍然对数组感到困惑。我提供的解决方案(声明所有结构已打包)也适用于数组。例如:

struct elem_struct {
    uint32_t x;
} __attribute__((packed));
// packed guarantees that sizeof(struct elem_struct) = sizeof(uint32_t) = 4

struct array_struct {
    struct elem_struct arr[10];
} __attribute__((packed));
// packed guarantees that sizeof(struct array_struct) =
// = sizeof(struct elem_struct[10]) = 10 * sizeof(struct elem_struct)
// = 10 * 4 = 40

关于数组的两个附加点是正确的 - 但仅在结构未打包时才有效。打包强制结构的字段是连续的,这个确实创建对齐问题,如果没有使用打包,将通过在成员之间插入空格并填充结构来解决(参见第I点)已经提出了关于对齐的问题。)