【发布时间】: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