对齐内存地址数据的目的是什么?

时间:2018-03-31 22:14:58

标签: memory cpu

据我所知,物理内存是由4(32位)或8(64位)字节的对齐块访问的。

但是为什么我们需要对齐内存地址的数据,比方说(在32位机器中):
我有一个char c从地址0开始(char占用一个字节,然后我有一个从地址1开始的整数i,所以当我想访问i时,计算机得到i的地址为1,然后读取4直接来自地址1的字节。

所以如果它以这种方式工作,为什么我们需要在char c之后填充3个字节?

1 个答案:

答案 0 :(得分:0)

正如您所说,“内存可以通过4或8字节的对齐块来访问”,具体取决于计算机的体系结构。这意味着处理器只能在可分为4或8的地址块上访问内存(这与我猜测的成本和设计复杂性有很大关系)。

让我们举例说明一下:

struct foo {
    char c;
    int i;
};

foo 在地址0x100的内存中对齐。如果访问foo.c,则只访问一个字节,但在幕后,CPU已从内存中读取了4个字节的整个字,并且该字中的3个下一个字节已被丢弃。

现在如果你在内存位置0x101读取foo.i(长度为4个字节),CPU将需要两个内存事务。一个在地址0x100处,它获取三个第一个字节,然后另一个在地址0x104处获取最后一个剩余字节。

最后,内存中对齐的数据可以节省不必要的内存事务。