【问题标题】:memory alignment- total size of structure multiple of structure alignement and not processing size内存对齐-结构总大小是结构对齐的倍数,而不是处理大小
【发布时间】:2014-10-08 19:47:19
【问题描述】:

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

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

这里是一个例子:

#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 (double d) 的结构对齐方式。

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

如果我采用结构数组,则每个结构的第一个元素对于 32 位处理器(0、20、40)来说都是很好的地址,因为 20、40 ... 是 4 的倍数(处理字长)。

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

感谢您的帮助

【问题讨论】:

  • 如你所说,结构需要8字节对齐。它也必须在数组中包含它。因此,它的大小必须是 8 的倍数。

标签: c++ c memory-alignment


【解决方案1】:

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

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

【讨论】:

  • 我不明白你所说的“第二个元素在 4 字节边界处对齐”是什么意思,你能解释得更清楚吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-06-05
  • 1970-01-01
  • 2012-06-23
  • 1970-01-01
  • 2021-12-24
  • 1970-01-01
  • 2020-07-26
相关资源
最近更新 更多