当你调用new []为N个整数分配一个数组时,是否保证数组将在物理内存中顺序分配?

时间:2015-03-25 12:43:23

标签: c++ memory memory-management

据我所知,每个计算机程序始终与虚拟内存一起使用,物理内存的处理方式取决于操作系统。

我正在参加算法工程课程,并且在某些时候提到如果缓存内存是无限的并且一个缓存行的大小为B,那么如果你想要的话,预期的缓存未命中数量只扫描一组N元素将是N/B

我可以看到这在理论上是如何工作的,因为我们假设N元素在物理内存中一个接一个地定位。

但是,这在实践中是否真的如此?如果按顺序分配虚拟内存,这是否也意味着物理内存也将按顺序分配?

听起来,在实践中,假设N不大于缓存大小,如果未分配N/B元素,则会出现超过N缓存未命中的情况顺序在物理内存(RAM)中。

也许我误解了虚拟内存和物理内存之间的区别,我不确定。

3 个答案:

答案 0 :(得分:4)

正如你所说:数组元素在虚拟内存中是连续的,但不一定在物理内存中。

在类似PC的架构中,内存以页面形式分配,这些页面通常比缓存行大得多(通常为几千字节而不是几十字节)。每个页面将连续范围的虚拟内存映射到连续的物理内存范围。因此,每个缓存行仍将跨越连续的物理内存范围,物理内存中的不连续性不会导致任何额外的缓存未命中。

答案 1 :(得分:1)

不需要为整个阵列全局顺序分配物理内存。为了保持N / B观察,您只需要在单个高速缓存行的边界内顺序分配物理内存。换句话说,当您跨越高速缓存行的边界时,下一行是来自物理内存中的相邻地址还是来自远处的某个物理地址并不重要。

如果虚拟内存页面以一定数量的缓存行的增量分配,并且还与缓存行对齐,则会出现这种情况。

这些假设对于当今存在的所有体系结构都可能是正确的,因为允许虚拟页面与缓存行不对齐或使奇数大小的虚拟页面会对虚拟内存体系结构的硬件支持提出更多要求。

答案 2 :(得分:0)

数组在虚拟内存空间中是连续的。在物理空间中,只有在单个页面内拟合的片段才是连续的。我见过的最好的计算机内存介绍可以下载from here