17

据我所知,默认情况下将完成 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 字节对齐的结构吗?

编辑::

根据维基

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

但是 Sample2 的成员不会以 2 的倍数对齐吗?

谢谢。

4

4 回答 4

28

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

结构体通常只与所有字段的最大对齐方式对齐。

于 2012-08-02T07:06:29.330 回答
8

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

data1是一个单字节项目,因此编译器不会尝试将其与任何特定边界对齐(即,这样做不会有真正的好处)。

于 2012-08-02T07:06:38.733 回答
5

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

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

于 2012-08-02T07:11:08.923 回答
2

Char 需要 1 个字节对齐。最大数据类型是 char ,这是一个字节对齐,因此您将大小设为“6”。

您可以查看此站点以获取更多了解。http://www.geeksforgeeks.org/archives/9705。他们已经详细解释过了。

于 2012-08-02T08:09:09.400 回答