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

Jey*_*ram 13 c structure padding

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

typedef struct
{
     int data7;  
     unsigned char data8;
     //3 -bytes will be added here.
}Sample1;
Run Code Online (Sandbox Code Playgroud)

所以sizeof(Sample1)将是8.

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

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

}Sample2;
Run Code Online (Sandbox Code Playgroud)

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

编辑::

按照Wiki

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

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

谢谢.

Mys*_*ial 23

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

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

  • 对于编辑:"字大小"不一定与处理器的原始字大小相同.如果数据类型较小,则可以应用较小的字大小.例如,在x86上,访问地址`mod 4!= 0`的`char`没有性能损失.但是如果你尝试使用`mod 4!= 0`来访问一个4字节的`int`,因为它会穿过一个4字节的对齐边界. (11认同)
  • 我认为理解它的关键字是**crosses**(“因为它_跨越_4字节对齐边界”)。谢谢@神秘! (3认同)

Jer*_*fin 6

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

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


AnT*_*AnT 5

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

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