今天读到一篇数据对齐的文章,明白了为什么需要数据对齐(地址对齐)。
不过作者的语言是属于作者自己的,我并不能立即理解他的全部表达。
只有我自己去思考推导之后才明白他的一些表达,因此我有必要将自己对这篇文章的解读记录下来。
原文:http://blog.youkuaiyun.com/tigerscorpio/article/details/5933807
.
地址对齐
数据对齐:数据A的存储地址的地址值 必须能整出 数据A的数据长度。
例如:
2Byte 的数据、就应该被存放在地址值为2的倍数的内存上。
4Byte的数据、就应该被存放在地址值为4的倍数的内存上。
所以,我们通常说 1字节的数据无论如何都是对齐的,2字节的数据需要2字节对齐,4字节的数据需要4字节对齐。
.
对齐的原因
(以32位机器为例、不考虑大小端)
数据需要对齐,是因为计算机在设计时,将32bit的数据分成4个1字节的数据,分别存放在4个内存芯片上,4个内存芯片共同构成一块最终的芯片。
4个芯片共用一条地址总线,每个内存单元的地址如下:
假如有数据A = 0x12345678,存放的地址是 0x00,是4字节对齐的。
那么这个4个字节会分别被存放在4块芯片的Offset=0处:
0x12345678 |
---|
0x12存放在Chip-0的Offset=0(地址0) |
0x34存放在Chip-1的Offset=0(地址1) |
0x56存放在Chip-2的Offset=0(地址2) |
0x78存放在Chip-3的Offset=0(地址3) |
CPU读取数据A时,会向地址总线发出 addr = 0x00 的地址值,由于4块芯片共用地址总线,所以4块芯片收到的地址值都是0x00,结果是都寻址到4块芯片的Offset=0处,一次寻址就读出32bit 的数据A。
.
假如数据A 不是4字节对齐 存放 的,比如存放的地址是 0x01。
那么这4个字节会分别被存放在4块芯片的如下位置:
0x12345678 |
---|
0x12存放在Chip-1的Offset&# |