考虑以下情况:
struct mystruct_A
{
char a;
int b;
char c;
} x;
struct mystruct_B
{
int b;
char a;
} y;
这些结构的大小分别为12和8。
这些结构是填充还是紧凑的?
填充或者紧凑是在什么时候发生的?
数据结构对齐是指计算机内存中数据的排列和访问方式。它包括两个独立但相关的问题:数据对齐和数据结构填充。当现代计算机从内存地址读取或写入数据时,它会以字大小的块(例如,在32位系统上为4字节块)或更大的块进行操作。数据对齐意味着将数据放置在内存地址等于某个字大小的倍数处,这增加了系统的性能,因为CPU处理内存的方式。为了对齐数据,可能需要在上一个数据结构的末尾和下一个数据结构的开头之间插入一些无意义的字节,这就是数据结构填充。
为了在内存中对齐数据,在进行内存分配时,在为其他结构成员分配内存地址时,插入一或多个空字节(地址)(或保持空闲)。这个概念被称为结构填充。 计算机处理器的架构是这样的,它可以一次从内存中读取1个字(32位处理器中的4个字节)。 为了利用处理器的这个优势,数据总是对齐为4字节的包,这导致在其他成员地址之间添加空地址。 由于C语言中存在结构填充的概念,因此结构的大小并不总是与我们想象的相同。
padding
会使事物变得更大。packing
则会使事物变得更小。两者完全不同。 - smwikipedia