我读过关于空间和时间位置的文章。
用几句话。
时间位置: 程序经常重复访问相同的内存位置。
空间局部性: 程序还经常重复访问相邻的内存位置。
现在,我开始分析以下代码,以查找引用的所有时间和空间位置。
for (int i = 0, j = 10; i < 100; i++)
a[i] = j++;
我只想出了以下内容。
空间
a[i] = j++;
在引用a[i]
之后,我们将引用a[i+1]
。- 执行所有这些操作的指令彼此相邻存储在内存中。
时间的
i
与100相比。i
递增一个:i++
。- 赋值
a[i] = j++
使用i
作为数组索引。 - 数组基
a
用于为每个a[i]
编制索引。 j
按分配a[i] = j++
中的 1 递增。
那么我在所有这些方面都是正确的,我错过了别的东西吗?
定义是相反的。
空间位置 - 空间中的位置,访问附近的内存位置。
时间位置 - 时间位置,多次访问同一位置。
在设计缓存时使用空间局部性是这样的,当你的程序需要a[i]
时,缓存只是不会从内存中获取a[i]
。它获取的条目a[i], a[i+1], a[i+2] ...
与缓存行的大小一样多。通过这样做,缓存预计您可能很快就会访问a[i+1]
。当您这样做时,缓存不需要从内存中获取它,由于使用了空间局部性,它已经存在。
当您访问i
和j
时,时间位置就来了。每次你需要i
和j
,无需从内存中获取它,因为它是缓存的。通过缓存,i
和j
,缓存认为您将再次访问它,因此节省了从内存中获取它的时间。
为了回答确切的问题,是的,您已经确定了空间和时间位置的位置。唯一不正确的是,您的陈述,">执行所有这些操作的指令彼此相邻存储在内存中"。访问a[i]
、a[i+1]
不会有单独的说明。它将是在循环中使用的单个指令,使用每次计算的内存地址。正如我上面所解释的,优点是缓存不需要为下一次迭代获取数据,因为它可能会作为循环中早期迭代的一部分获取。