自然对齐意味着类型的地址是类型大小的倍数。
例如,字节可以位于任意地址,短字节(假定16位)必须位于2的倍数上,int(假设32位)必须位于4的倍数上,长(假设64位)必须位于8的倍数上。
如果您访问了一段未自然对齐的数据,CPU要么会引发故障,要么会读写内存,而不是作为原子操作。CPU所采取的操作将取决于体系结构。
例如,图像中的内存布局如下:
01234567...XXXX.
和
int *data = (int*)3;
当我们试着阅读*data
组成该值的字节分布在2个int大小块中,1个字节位于块0-3中,3个字节分布在块4-7中。现在,仅仅因为这些块在逻辑上是相邻的,这并不意味着它们是物理上的。例如,块0-3可能位于CPU缓存行的末尾,而块3-7位于页文件中。当CPU进入访问块3-7以获得它所需的3个字节时,它可能会看到该块不在内存中,并发出它需要内存分页的信号。这可能会阻塞调用进程,而操作系统会将内存重新分页。
在内存被分页之后,但是在您的进程被唤醒之前,另一个进程可能会出现并编写一个Y
然后您的进程被重新安排,CPU完成读取,但是现在它已经读取了XYXX,而不是您期望的XXXX。