为什么需要在结构中填充?

Why padding in structures is required?

我们知道,在结构中声明变量的正确顺序也会因为填充而改变结构的大小。我看到参考 here.

假设一个结构是:

struct s {
    char b; //1 for char
    char c; //1 for char + 2 for padding
    int a; //4 for int
}my_struct;

所以 my_struct 的大小是 8,但如果没有填充,它可能是 6,小于 8

所以我的问题是:为什么填充是在结构中完成的?这个概念的必要性是什么?

因为没有填充,结构的尺寸较小。我的问题与填充何时发生无关,它更关心填充的概念。

许多计算机体系结构都以不同于 1 字节(通常 1 字 = 4 字节)的对齐方式优化了内存访问。对齐访问通常比未对齐访问更快(有时,不可能访问未对齐数据)。出于这个原因,编译器以最佳对齐方式打包结构成员。在您的示例中,看起来对齐大小为 2 个字节,因此 b 位于偏移量 0,c 位于偏移量 2,a 位于偏移量 4,总共 8 个字节(假设 a 是 4 个字节长)。或者,根据内联注释,在您的示例中,最佳对齐方式看起来等于数据大小。因此,bc 是相邻的,因为大小为 1,对齐也是如此,但是 a 是 4 字节长,因此需要 4 字节对齐。

最重要的是——这完全取决于体系结构。