8

我的问题与类似,但是我问的有点不同。

很明显,可以将第一个std::vector元素的地址用作C类型数组。这意味着在虚拟内存中,std::vector元素是连续的。但是,如果物理内存是碎片化的,则有可能std::vector实际上在物理内存中被分割成许多部分。

我的问题是:std::vector物理内存(以及虚拟内存)中的元素是否连续?

4

3 回答 3

18

用于将数据存储在向量中的内存必须位于连续地址,因为这些地址对代码是可见的。

在大多数现代 CPU/操作系统的典型情况下,这意味着虚拟地址必须是连续的。如果这些虚拟地址跨越页面边界,那么物理地址很可能不再是连续的。

我应该补充一点,这很少是一个主要问题。在许多情况下,现代系统至少对这种碎片化的内存使用提供了一些支持,直至硬件级别。例如,许多网络和磁盘控制器都包含“分散/收集”功能,其中操作系统使用页表将缓冲区的虚拟地址转换为物理地址,然后将许多物理地址直接提供给控制器,然后控制器收集如果从内存传输到外围设备,则来自这些地址的数据;如果从外围设备传输到内存,则将数据“分散”到这些地址。

于 2013-08-30T21:54:44.237 回答
7

不,不能保证在 C++ 的抽象机器中会为您提供连续的物理内存。下面的抽象和硬件malloc可以自由使用不连续的内存。

只有您的目标实现才能做出这样的保证,但语言/模型并不关心。它依赖于系统来完成它的工作。

于 2013-08-30T21:56:34.587 回答
1

虚拟到物理内存的映射主要由 CPU 处理,但有内核支持。用户态进程无法知道这个映射是什么:你的程序,无论是什么编程语言,都只处理虚拟内存地址。您不能期望,甚至没有任何方法可以找出跨越页面边界的两个相邻虚拟内存地址在物理内存中是否相邻,因此绝对没有必要担心。

于 2013-08-30T22:42:36.217 回答