是什么内存对齐?
在C语言中,内存对齐是按照一定的规则在内存中排列数据,从而使数据的起始地址符合特定的要求。根据 The GNU C Reference Manual 的 2.4.5 Size of Structures 一章所提到的:
The size of a structure type is equal to the sum of the size of all of its members, possibly including padding to cause the structure type to align to a particular byte boundary. The details vary depending on your computer platform, but it would not be atypical to see structures padded to align on four- or eight-byte boundaries. This is done in order to speed up memory accesses of instances of the structure type.
一个结构体可能会包含一些填充部分(padding)来使之对齐到一个特定的字节边界(particular byte boundary),实际上就是开头我们描述的使数据的起始地址要符合特定的要求。比如我们有 a 和 b 两个数据,都占一个单位的大小,正常情况下我们会将这两个紧挨着一起摆放,如下:
<p>+---+---+---+---+---+</p><p>| 0 | 1 | 2 | 3 | 4 |</p><p>+---+---+---+---+---+</p><p>| a | b | * | * | * |</p><p>+---+---+---+---+---+</p>
可以看到 a 被放在了 0 地址,b 被放在了 1 地址,* 表示其他内容,在这里我们不关注。这种存放顺序也是最符合我们主观常识的方式。然而此时如果我们加个条件,b 元素必须要在能被 4 整除的地址上(0、4、8 ...)才能正常访问,此时元素的摆放顺序就改变了:
<p>+---+---+---+---+---+</p><p>| 0 | 1 | 2 | 3 | 4 |</p><p>+---+---+---+---+---+</p><p>| a | - | - | - | b |</p><p>+---+---+---+---+---+</p>
可以看到在这种情况下,a 仍然是在 0 地址,但 b 却跨过了 3 个元素的空间,被摆放在了 4 地址,中间的 - 就是填充元素,其功能就是把 b 元素挤到 4 这个地址,从而使它可以被正常访问到。
这,就是内存对齐!在上例中,我们可以说 b 元素是 4 字节对齐的。
|