2012-08-02 141 views
12

据我所知,默认情况下将完成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(样品2)只有6。这个Sample2不是一个4字节对齐的结构?

EDIT ::

作为每维基

数据对齐是指将数据以存储器偏移量等于字尺寸,这提高了系统的性能的某个倍数由于CPU的方式处理内存。

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

谢谢。

+2

好问题+1 – Angus 2012-08-02 08:11:53

回答

20

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

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

+9

对于编辑:“字大小”不一定与处理器的原始字大小相同。如果数据类型较小,则可应用较小的字大小。例如,在x86上,在'mod 4!= 0'地址访问'char'没有任何性能损失。但是如果你尝试访问带有'mod 4!= 0'的4字节'int',因为它跨越了4字节的对齐边界。 – Mysticial 2012-08-02 07:20:29

+1

谢谢@Mystical。很多需要的答案。这就是我要找的。 – Jeyaram 2012-08-02 07:26:34

5

data7是一个4字节的项目,所以编译器通常会试图将其调整到这的4

data1倍数的地址是一个字节的项目,所以编译器不会尝试将其与任何特定边界对齐(即,这样做不会有真正的收益)。

3

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

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

1

字符需要1点字节对齐。最大数据类型是char, 这是一个字节对齐,因此您得到的大小为'6'。

您可以查看本网站以获得更多了解。 http://www.geeksforgeeks.org/archives/9705。 他们详细解释了它。

相关问题