每个内存地址指向一个字节的数据
因此,地址 0x00 指向一个字节,地址 0x01 指向下一个字节。

1字节对齐的数据可以存储在任何地址上,每个数据项只占用1个字节。

地址:  0x00  0x01  0x02  0x03  0x04  0x05  0x06  0x07  0x08  0x09  0x0A  0x0B  0x0C  0x0D  0x0E  0x0F
数据:  [D1]  [D2]  [D3]  [D4]  [D5]  [D6]  [D7]  [D8]  [D9]  [DA]  [DB]  [DC]  [DD]  [DE]  [DF]  [E0]

2字节对齐的数据必须存储在地址是2的倍数的位置上,每个数据项占用2个字节。

地址:  0x00  0x01  0x02  0x03  0x04  0x05  0x06  0x07  0x08  0x09  0x0A  0x0B  0x0C  0x0D  0x0E  0x0F
数据:  [D1][D2]      [D3][D4]      [D5][D6]      [D7][D8]      [D9][DA]      [DB][DC]      [DD][DE]

4字节对齐的数据必须存储在地址是4的倍数的位置上,每个数据项占用4个字节。

地址:  0x00  0x01  0x02  0x03  0x04  0x05  0x06  0x07  0x08  0x09  0x0A  0x0B  0x0C  0x0D  0x0E  0x0F  0x10  0x11  0x12  0x13
数据:  [D1][D2][D3][D4]          [D5][D6][D7][D8]          [D9][DA][DB][DC]          [DD][DE][DF][E0]

浪费空间的情况
假如, 数据大小只有一个字节, 非要用4个字节对齐, 那样也确实会量费空间。

struct Mixed {
    char a;     // 1字节
    int b;      // 4字节
    char c;     // 1字节
};

申请到的内存空间

地址:  【0x00  0x01  0x02  0x03】  【0x04  0x05  0x06  0x07】  【0x08  0x09  0x0A  0x0B】
数据:  【[ a ] [ P ] [ P ] [ P ]】 【[ b ] [ b ] [ b ] [ b ]】 【[ c ] [ P ] [ P ] [ P ]】

p是填充的空间, 结果造成了很多浪费

应该怎么优化呢?

struct Optimized {
    int b;      // 4字节
    char a;     // 1字节
    char c;     // 1字节
};
地址:  【0x00  0x01  0x02  0x03】  【0x04  0x05  0x06  0x07】//4的倍数开始存储
数据:  【[ b ] [ b ] [ b ] [ b ]】 【[ a ] [ c ] [ P ] [ P ]】

putao
8 声望3 粉丝

推动世界向前发展,改善民生。