结构体填充和紧凑化

324

考虑以下情况:

struct mystruct_A
{
   char a;
   int b;
   char c;
} x;

struct mystruct_B
{
   int b;
   char a;
} y;

这些结构的大小分别为12和8。

这些结构是填充还是紧凑的?

填充或者紧凑是在什么时候发生的?


3
阅读 https://dev59.com/jnVD5IYBdhLWcg3wAWoO为什么一个结构体的 sizeof 不等于每个成员变量 sizeof 的总和? - Prasoon Saurav
43
失传的C结构体打包艺术 - http://www.catb.org/esr/structure-packing/ - Paolo
3
padding 会使事物变得更大。packing 则会使事物变得更小。两者完全不同。 - smwikipedia
@Paolo,那个“Lost Art”链接没有展示指针对齐时会发生什么,以及上面两个int可能会相互挨着的情况。 - mLstudent33
相关的,针对C++:https://stackoverflow.com/questions/44287060/c-class-packing-member-alignment - Gabriel Staples
参见:https://dev59.com/2nA75IYBdhLWcg3wZ4Fr - Gabriel Staples
11个回答

-1

数据结构对齐是指计算机内存中数据的排列和访问方式。它包括两个独立但相关的问题:数据对齐和数据结构填充。当现代计算机从内存地址读取或写入数据时,它会以字大小的块(例如,在32位系统上为4字节块)或更大的块进行操作。数据对齐意味着将数据放置在内存地址等于某个字大小的倍数处,这增加了系统的性能,因为CPU处理内存的方式。为了对齐数据,可能需要在上一个数据结构的末尾和下一个数据结构的开头之间插入一些无意义的字节,这就是数据结构填充。

为了在内存中对齐数据,在进行内存分配时,在为其他结构成员分配内存地址时,插入一或多个空字节(地址)(或保持空闲)。这个概念被称为结构填充。 计算机处理器的架构是这样的,它可以一次从内存中读取1个字(32位处理器中的4个字节)。 为了利用处理器的这个优势,数据总是对齐为4字节的包,这导致在其他成员地址之间添加空地址。 由于C语言中存在结构填充的概念,因此结构的大小并不总是与我们想象的相同。

1
你为什么需要在你的答案中链接相同的文章5次?请只保留一条示例链接。另外,由于你链接到自己的文章,你需要披露这个事实。 - Artjom B.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接