繁体   English   中英

结构成员对齐混乱

[英]Confusion in Structure Member Alignment

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

我在博客中读到,这将占用24个字节的数据:

sizeof(char)+ 7字节填充+ sizeof(double)+ sizeof(int)+ 4字节填充= 1 + 7 + 8 + 4 + 4 = 24字节

我的问题是为什么7个字节的填充,为什么我们不能在那里使用3个字节的填充并利用接下来的8个字节来加倍呢? 最后4个字节需要什么?

您需要考虑如果使用malloc()分配这些结构的数组会发生什么情况:

structc_t *p = malloc(2 * sizeof *p);

考虑一个平台,其中sizeof(double) == 8sizeof(int) == 4并且double的必需对齐方式是malloc()始终返回正确对齐的地址以存储任何C类型-因此,在这种情况下a将是8字节对齐。 然后,填充要求自然会下降:

  • 为了使a[0].d对齐8字节,因此a[0].c之后必须有7个字节的填充;

  • 为了使a[1].d对齐8字节,整个结构大小必须为8的倍数,因此a[0].s之后必须有4个字节的填充。

如果将struct从最大到最小重新排序:

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

...然后,仅需填充是.c之后的3个字节,以使结构大小为8的倍数。这导致结构的总大小为16,而不是24。

它取决于平台,但是取决于将double对齐的对象。 如果将其对齐为8个字节(似乎是这种情况),则3个字节的填充不会削减它。

如果将double对齐到4个字节,那么您会正确,并且将使用3个字节的填充。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM