C 结构中的内存对齐

新手上路,请多包涵

我正在使用 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 许可协议

阅读 490
2 个回答

至少在大多数机器上,类型只与类型本身一样大的边界对齐[编辑:你不能真正要求任何“更多”对齐,因为你必须能够创建数组,并且你无法将填充插入数组]。在您的实现中, short 显然是 2 个字节,而 int 是 4 个字节。

这意味着您的第一个结构与 2 字节边界对齐。由于所有成员都是 2 个字节,因此在它们之间没有插入填充。

第二个包含一个 4 字节的项目,它与 4 字节的边界对齐。由于前面有 6 个字节,因此在 v3i 之间插入了 2 个字节的填充,在 short 中给出了 6 个字节的数据,两个字节的填充, 以及 int 中多 4 个字节的数据,总共 12 个。

原文由 Jerry Coffin 发布,翻译遵循 CC BY-SA 3.0 许可协议

假设:

 sizeof(unsigned short) == 2
sizeof(int)            == 4

然后我个人会使用以下内容(您的编译器可能会有所不同):

 unsigned shorts are aligned to 2 byte boundaries
int will be aligned to 4 byte boundaries.

typedef struct
{
   unsigned short v1;    // 0 bytes offset
   unsigned short v2;    // 2 bytes offset
   unsigned short v3;    // 4 bytes offset
} myStruct;              // End 6 bytes.

// No part is required to align tighter than 2 bytes.
// So whole structure can be 2 byte aligned.

typedef struct
{
    unsigned short v1;      // 0 bytes offset
    unsigned short v2;      // 2 bytes offset
    unsigned short v3;      // 4 bytes offset
    /// Padding             // 6-7 padding (so i is 4 byte aligned)
    int i;                  // 8 bytes offset
} myStruct;                 // End 12 bytes

// Whole structure needs to be 4 byte aligned.
// So that i is correctly aligned.

原文由 Martin York 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题