给定代码段中引用的时间和空间位置的所有出现



我读过关于空间时间位置的文章。

用几句话。

时间位置: 程序经常重复访问相同的内存位置。

空间局部性: 程序还经常重复访问相邻的内存位置。

现在,我开始分析以下代码,以查找引用的所有时间和空间位置。

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]。当您这样做时,缓存不需要从内存中获取它,由于使用了空间局部性,它已经存在。

当您访问ij时,时间位置就来了。每次你需要ij,无需从内存中获取它,因为它是缓存的。通过缓存,ij,缓存认为您将再次访问它,因此节省了从内存中获取它的时间。

为了回答确切的问题,是的,您已经确定了空间和时间位置的位置。唯一不正确的是,您的陈述,">执行所有这些操作的指令彼此相邻存储在内存中"。访问a[i]a[i+1]不会有单独的说明。它将是在循环中使用的单个指令,使用每次计算的内存地址。正如我上面所解释的,优点是缓存不需要为下一次迭代获取数据,因为它可能会作为循环中早期迭代的一部分获取。

相关内容

最新更新