数据结构填充和内存分配



根据维基百科,一个包含一个字节和一个四字节整数的结构,按照这个顺序,将需要三个额外的字节填充,因为这个四字节整数必须对齐4个字节。

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

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

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


[update from comment:]

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


(更新)

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

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

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

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

Required:类型的某些对齐是必需的,如2字节整数可能导致奇数地址上的总线故障。编译器特定的包选项不会违反这一点。包装可减少填充物,但仍可保留一些填充物。


回答OP的问题:
都是"可能"。考虑到它的选项和目标硬件,它是特定于编译器的。

最新更新