为什么需要在结构中填充?
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 个字节长)。或者,根据内联注释,在您的示例中,最佳对齐方式看起来等于数据大小。因此,b
和 c
是相邻的,因为大小为 1,对齐也是如此,但是 a
是 4 字节长,因此需要 4 字节对齐。
最重要的是——这完全取决于体系结构。
我们知道,在结构中声明变量的正确顺序也会因为填充而改变结构的大小。我看到参考 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 个字节长)。或者,根据内联注释,在您的示例中,最佳对齐方式看起来等于数据大小。因此,b
和 c
是相邻的,因为大小为 1,对齐也是如此,但是 a
是 4 字节长,因此需要 4 字节对齐。
最重要的是——这完全取决于体系结构。