每个内存地址指向一个字节的数据。
因此,地址 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 ]】
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。