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

C++ 给定代码段中引用的所有时间和空间位置,c++,cpu-architecture,cpu-cache,localityofreference,C++,Cpu Architecture,Cpu Cache,Localityofreference,我读过关于空间和时间地方的文章 几句话 时间位置: 程序经常重复访问相同的内存位置 空间位置: 程序也经常重复访问相邻的内存位置 现在我将分析下面的代码,以找到引用的所有时间和空间位置 for (int i = 0, j = 10; i < 100; i++) a[i] = j++; for(inti=0,j=10;i

我读过关于空间时间地方的文章

几句话

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

空间位置: 程序也经常重复访问相邻的内存位置

现在我将分析下面的代码,以找到引用的所有时间和空间位置

for (int i = 0, j = 10; i < 100; i++)
    a[i] = j++;
for(inti=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++
    中的一个递增


那么,我所有这些都正确吗?我是否遗漏了其他东西?

定义则相反

空间位置-空间位置,访问附近的内存位置

时间位置-时间位置,多次访问同一位置

在设计缓存时使用空间局部性是这样的,当程序需要
a[i]
时,缓存就不会从内存中获取
a[i]
。它获取的条目数不多,
a[i]、[i+1]、[i+2]…
相当于缓存线的大小。这样做,您可能很快就能访问[i+1]
。当您这样做时,缓存不需要从内存中获取它,由于使用了空间局部性,它已经存在了

当您访问
i
j
时,会出现时间局部性。每次您需要
i
j
时,无需从内存中获取它,因为它是缓存的。通过缓存,
i
j
,缓存认为您将再次访问它,因此节省了从内存中获取它的时间


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

定义是另一种方式

空间位置-空间位置,访问附近的内存位置

时间位置-时间位置,多次访问同一位置

在设计缓存时使用空间局部性是这样的,当程序需要
a[i]
时,缓存就不会从内存中获取
a[i]
。它获取的条目数不多,
a[i]、[i+1]、[i+2]…
相当于缓存线的大小。这样做,您可能很快就能访问[i+1]。当您这样做时,缓存不需要从内存中获取它,由于使用了空间局部性,它已经存在了

当您访问
i
j
时,会出现时间局部性。每次您需要
i
j
时,无需从内存中获取它,因为它是缓存的。通过缓存,
i
j
,缓存认为您将再次访问它,因此节省了从内存中获取它的时间


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

是的,感谢您注意到定义中的输入错误。我已经更新了我的问题是的,谢谢你注意到定义中的拼写错误。我已经更新了我的问题