内存中变量的对齐(简短的历史)。
过去计算机有一个 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 字节)时,这一点更为重要。这就是为什么对于大多数现代编译器,您可以在编译程序时选择使用哪种对齐方式。