为什么在这种情况下不会发生填充?

据我所知,默认情况下将完成4字节对齐。 说

typedef struct { int data7; unsigned char data8; //3 -bytes will be added here. }Sample1; 

sizeof(Sample1)将为8。

但对于以下结构,为什么没有发生填充?

 typedef struct { unsigned char data1; unsigned char data2; unsigned char data3; unsigned char data4; unsigned char data5; unsigned char data6; }Sample2; 

但sizeof(Sample2)仅为6。 Sample2不是4字节对齐的结构?

编辑::

按照Wiki

数据对齐意味着将数据放入存储器偏移量等于字大小的某个倍数,这会因CPU处理内存的方式而提高系统性能。

但Sample2的成员不会以两个的倍数对齐?

谢谢。

第二个结构中的所有字段都不需要4字节对齐。 unsigned char只需要1字节对齐。 因此,不需要将其实际对齐到4个字节。

结构通常仅与所有字段的最大对齐对齐。

data7是一个4字节的项,因此编译器通常会尝试将其与4的倍数对齐。

data1是一个单字节项,因此编译器不会尝试将其与任何特定边界对齐(即,这样做不会有实际收益)。

不,在典型的实现中, Sample2不是4-bute对齐结构。 它是一个1字节对齐的结构。

在典型的实现中,整个结构的对齐要求被计算为其各个成员的对齐要求的最大值 。 这就是为什么Sample1对齐要求为int (平台上为4),而Sample2对齐要求为unsigned char ,即1。

Char需要1个字节对齐。 最大数据类型有char,它是一个字节对齐,因此你得到的大小为’6’。

您可以查看此站点以获得更多信息。 http://www.geeksforgeeks.org/archives/9705 。 他们已详细解释了这一点。