簡體   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