为什么这种情况下没有发生填充?

20

据我所知,默认情况下会进行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;
但是Sample2的大小只有6。这个Sample2不是一个4字节对齐的结构吗?
编辑:
根据维基百科
数据对齐意味着将数据放置在内存偏移量上,该偏移量等于字长(word size)的某个倍数,由于CPU处理内存的方式,这可以提高系统的性能。
但是Sample2的成员不会以两个为倍数进行对齐,是吗?
谢谢。
4个回答

32

你的第二个结构中没有任何字段需要4字节对齐。 unsigned char 只需要1字节对齐。因此,实际上没有必要将其对齐到4字节。

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


18
编辑:这里的“字长(word-size)”不一定与处理器本机的字长相同。如果数据类型更小,则可以使用较小的字长。例如,在x86上,访问地址mod 4!= 0处的char没有性能惩罚。但是,如果您尝试使用mod 4!= 0访问4字节的int,则会出现性能问题,因为它跨越了4字节对齐边界。 - Mysticial
1
谢谢@Mystical。非常需要的答案。这就是我在寻找的。 - Jeyaram
3
我认为理解这个关键词是“crosses”(“因为它_跨越_4字节对齐边界”)。谢谢@Mystical! - MaciekS

8

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

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


5

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

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


3

Char需要1字节对齐。最大的数据类型是char,它需要1字节对齐,因此您得到的大小为“6”。

您可以查看此网站以了解更多信息。http://www.geeksforgeeks.org/archives/9705。他们已经详细解释了这个问题。


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