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]
- 执行所有这些操作的指令都存储在内存中,彼此相邻
与100相比i
增加一: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]
不会有单独的指令。它将是循环中使用的单个指令,使用每次计算的内存地址。正如我在上面解释的,优点是缓存不需要为下一次迭代获取数据,因为它可能作为循环中早期迭代的一部分获取。是的,感谢您注意到定义中的输入错误。我已经更新了我的问题是的,谢谢你注意到定义中的拼写错误。我已经更新了我的问题