首页 > 解决方案 > 64位系统中结构的内存分配

问题描述

我正在经历旧的考试并发现了这个问题,我必须在 64 位操作系统上为这个特定的结构输入字段大小和填充大小:

struct mystruct {
    char a;
    uint32_t b;
    int16_t c;
    int64_t d;
};

答案是:

struct mystruct {
    char a;     //field size: 1, padding size: 3
    uint32_t b; //field size: 4, padding size: 0
    int16_t c;  //field size: 2, padding size: 6
    int64_t d;  //field size: 8, padding size: 0
};

我确实理解为什么int16_t分配 2 字节和 6 个填充,因为 64 位架构。与 相同int64_t

但是,当它是 64 位架构时,为什么char分配的填充大小为 3 ,字段大小为 4?uint32_t

标签: cmemorystruct64-bitpadding

解决方案


struct mystruct {
    char a;     //field size: 1, padding size: 3
    uint32_t b; //field size: 4, padding size: 0
    int16_t c;  //field size: 2, padding size: 6
    int64_t d;  //field size: 8, padding size: 0
};

我确实理解为什么 int16_t 被分配 2 个字节和 6 个填充,因为 64 位架构。与 int64_t 相同。但是,当它是 64 位架构时,为什么 char 分配了 3 个填充大小和 uint32_t 的字段大小为 4?

因为:

  • char将从任何偏移量开始。

  • unit32_t将从偏移量开始mod(4) == 0

  • int16_t将从偏移量开始mod(2) == 0

  • int64_t将从偏移量开始mode(8) == 0

因此

 offset  ->   0   1           4    8   10           16            24
              +--------------------+----------------+-------------+
              | a | 3byte pad |  b | c | 6byte pad  |   d         |
              +--------------------+----------------+-------------+

推荐阅读