2014-10-08 74 views
1

在之前的文章中,我已经理解为什么我们必须对等于最大属性大小的结构进行对齐。内存调整 - 结构调整和不处理大小的结构倍数的总大小

现在,我想知道为什么,一旦我们选择了这种对齐方式,我们必须进行填充,以使总体结构尺寸是结构对齐的倍数而不是处理器字的尺寸。

下面的例子:

#include <stdio.h> 

// Alignment requirements 
// (typical 32 bit machine) 

// char   1 byte 
// short int 2 bytes 
// int   4 bytes 
// double  8 bytes 

typedef struct structc_tag 
{ 
    char  c; 
    double  d; 
    int   s; 
} structc_t; 

int main() 
{ 
    printf("sizeof(structd_t) = %d\n", sizeof(structd_t)); 

    return 0; 
} 

我们可以认为structd_t的是大小等于20个字节:

char  c; 
    char Padding1[7] 
    double  d; 
    int   s; 

,因为我们已经采取了结构alignement等于8(双d) 。

但实际上,总大小等于24,因为20不是8的倍数,我们必须在“int s”之后进行填充(char Padding2 [4])。

如果我采用一个结构数组,每个结构的第一个元素在32位处理器(0,20,40)的良好地址上,因为20,40是4的倍数(处理字大小) 。

所以为什么我需要填充8的倍数(结构对齐),即在这个例子中是24字节,而不是20字节(这给了32位处理器的良好地址(字大小= 4个字节):0,20,40 ...

感谢您的帮助

+1

正如你所说,结构需要8字节对齐。它也必须在数组内部。因此,它的大小必须是8的倍数。 – molbdnilo 2014-10-08 20:53:19

回答

3

考虑struct_t array[n]会结构的大小为20(而不是多个8),第二个元素是在4对齐。字节边界

澄清:假设array[0]位于地址0如果第e结构是20array[1]从地址20开始,并且它的d登陆地址28,这不是双精度对齐。

+0

我不明白“第二个元素在4字节边界处对齐”是什么意思,你能更精确地解释一下吗? – youpilat13 2014-10-08 20:44:46

+0

加入请求。这个我不清楚。 – user2962533 2016-06-16 14:17:26

+0

@ user2962533请参阅编辑 – user58697 2016-06-16 17:34:35