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



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

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

这里有一个例子:

#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) = %dn", sizeof(structd_t));
   return 0;
}

我们可以认为struct_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个字节)提供了很好的地址):0,20,40?

感谢您的帮助

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

澄清:让array[0]位于地址0。如果结构的大小是20,则array[1]从地址20开始,并且它的d在地址28着陆,这对于双精度来说不是合适的对准。

最新更新