我正在使用 32 位机器,所以我想内存对齐应该是 4 个字节。假设我有这个结构:
typedef struct {
unsigned short v1;
unsigned short v2;
unsigned short v3;
} myStruct;
普通添加的大小是 6 个字节,我想对齐的大小应该是 8,但是 sizeof(myStruct)
返回我 6。
但是,如果我写:
typedef struct {
unsigned short v1;
unsigned short v2;
unsigned short v3;
int i;
} myStruct;
普通添加大小为 10 个字节,对齐大小应为 12,这一次 sizeof(myStruct) == 12
。
有人可以解释有什么区别吗?
原文由 Ivan 发布,翻译遵循 CC BY-SA 4.0 许可协议
至少在大多数机器上,类型只与类型本身一样大的边界对齐[编辑:你不能真正要求任何“更多”对齐,因为你必须能够创建数组,并且你无法将填充插入数组]。在您的实现中,
short
显然是 2 个字节,而int
是 4 个字节。这意味着您的第一个结构与 2 字节边界对齐。由于所有成员都是 2 个字节,因此在它们之间没有插入填充。
第二个包含一个 4 字节的项目,它与 4 字节的边界对齐。由于前面有 6 个字节,因此在
v3
和i
之间插入了 2 个字节的填充,在short
中给出了 6 个字节的数据,两个字节的填充, 以及int
中多 4 个字节的数据,总共 12 个。