64位系统中struct的内存分配

Memory allocation from struct in 64 bit system

我正在通过旧考试发现这个问题,我必须在 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.

相同

但是,为什么 char 在 64 位架构中分配了 3 个填充大小,而 uint32_t 分配了 4 个字段大小?

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
};

I do understand why int16_t gets allocated 2 Bytes and 6 padding, because of the 64 bit architecture. Same with int64_t. But why is the char allocated with 3 padding size and uint32_t with field size of 4 when its a 64 Bit architecture ?

因为:

  • 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         |
              +--------------------+----------------+-------------+