[英]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.