内存对齐 - 结构对齐的结构的总大小,而不是处理大小

时间:2014-10-08 19:47:19

标签: c++ c memory-alignment

在上一篇文章中,我已经理解为什么我们必须对一个等于最大属性大小的结构进行对齐。

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

这是一个例子:

#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;

因为我们已将结构对齐等于8(双d)。

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

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

那么为什么我必须为8的倍数(结构对齐)做填充,即本例中为24个字节,而不是20个字节(这为32位处理器提供了良好的地址(字大小= 4) bytes):0,20,40 ......?

感谢您的帮助

1 个答案:

答案 0 :(得分:3)

考虑struct_t array[n]。如果结构的大小为20(不是8的倍数),则第二个元素以4字节边界对齐。

澄清:让array[0]位于地址0。如果结构的大小为20,则array[1]从地址20开始,而d位于地址28,这不是一个正确的对齐方式双