std :: vector元素在物理内存中是连续的吗?

时间:2013-08-30 20:24:06

标签: c++ memory memory-management vector

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

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

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

3 个答案:

答案 0 :(得分:14)

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

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

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

答案 1 :(得分:6)

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

只有您的目标实施可以做出这样的保证,但语言/模型并不关心。它依靠系统来完成它的工作。

答案 2 :(得分:1)

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