内存中变量的对齐方式(简史)。
过去计算机有一个8位数据总线。这意味着每个时钟周期可以处理8位信息。那时候还不错。
然后出现了16位计算机。由于向下兼容性和其他问题,保留了8位字节,并引入了16位字。每个字是2个字节。每个时钟周期可以处理16位信息。但这带来了一个小问题。
让我们看一下内存映射:
+----+
|0000|
|0001|
+----+
|0002|
|0003|
+----+
|0004|
|0005|
+----+
| .. |
每个地址都有一个可以单独访问的字节。但是只能在偶数地址处获取字。因此,如果我们在0000处读取一个字,我们读取0000和0001处的字节。但是如果我们想要读取位置0001处的字,我们需要进行两次读取操作。首先读取0000,0001,然后读取0002,0003,我们只保留0001,0002。
当然,这会花费额外的时间,而且人们并不欣赏这种方式。因此他们发明了对齐方式。因此,我们将字变量存储在字边界上,将字节变量存储在字节边界上。
例如,如果我们有一个包含一个字节字段(B)和一个字字段(W)的结构体(并且使用非常简单的编译器),我们得到以下结果:
+----+
|0000| B
|0001| W
+----+
|0002| W
|0003|
+----+
这并不好玩。但是当使用单词对齐时,我们发现:
+----+
|0000| B
|0001| -
+----+
|0002| W
|0003| W
+----+
在这里,为了提高访问速度而牺牲了内存。
可以想象,当使用双字(4字节)或四字(8字节)时,这一点更加重要。这就是为什么在大多数现代编译器中,编译程序时可以选择使用哪种对齐方式。