数据结构填充和内存分配

时间:2014-06-25 13:07:28

标签: c memory-alignment

根据Wikipedia,包含单字节和四字节整数的结构按此顺序需要三个额外的填充字节,因为四字节整数必须是4字节对齐。

  1. 按顺序包含四字节整数和单字节的结构不需要额外的填充字节,因为一个字节将是1字节对齐的?

  2. 第一个结构的大小是8,但第二个结构的大小是5?

  3. 上面第二个结构之后在内存中分配的另一个四字节整数呢?它是否会在3个字节的间隙之后分配,以便它尊重4个字节的对齐?


  4. [评论更新:]

    我忘了提到我的例子是在32位系统上。


    [UPDATE]

    我刚刚发现在结构的开头和结尾添加的包指令仅适用于结构的成员而不会传播到其他结构。这意味着如果你有一个结构结构,你必须单独打包它们,而不仅仅是父结构。

2 个答案:

答案 0 :(得分:4)

  1. 也许,也许不是。您可能在一个喜欢填充到8字节边界的架构上。
  2. 可能。永远不要假设编译器之间的C结构具有相同的,可预测的二进制表示。甚至可以在同一个编译器中使用不同的选项。
  3. 也许。在示例体系结构中,可能是。但是,如果编译器的库倾向于分配更大的块,那么差距实际上可能更大。

答案 1 :(得分:0)

数据对齐和打包中缺少的考虑因素是数据对齐至少有两个方面。

性能:某些类型的对齐方式(如4字节int)通常在匹配(四元组)地址边界上的对齐时执行得更快。这通常是编译器默认值。有时其他性能较低的对齐也是可能的。编译器特定的包选项可能使用这种不太理想的速度布局来实现更少的填充。

必需:需要某些类型的对齐,例如2字节整数可能会导致奇数地址出现总线故障。编译器特定的包选项不会违反此规定。包装可能会减少填充,但可能会留下一些填充物。

回答OP的问题:
所有人都是"也许"。它是特定于编译器的,考虑了它的选项和目标硬件。