[英]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) == 8
, sizeof(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.