我的问题类似于this,但我问的是有点不同。
很明显,可以将第一个std::vector
元素的地址用作C
类型数组。这意味着在虚拟内存中,std::vector
元素是连续的。但是,如果物理内存碎片化,std::vector
实际上可能会分成物理内存中的许多部分。
我的问题是:std::vector
元素在物理内存(以及虚拟内存)中是否连续?
答案 0 :(得分:14)
用于在向量中存储数据的内存必须位于连续的地址,因为这些地址对代码是可见的。
在大多数现代CPU /操作系统的典型情况下,这意味着虚拟地址必须是连续的。如果这些虚拟地址跨越页面边界,那么物理地址很可能不再是连续的。
我应该补充一点,这很少是一个主要问题。在许多情况下,现代系统至少对这种分散的内存使用有一定的支持,直到硬件级别。例如,许多网络和磁盘控制器都包含“分散/聚集”功能,其中操作系统使用页表将缓冲区的虚拟地址转换为物理地址,然后直接向控制器提供多个物理地址,然后控制器收集来自这些地址的数据,如果它从内存传输到外设或者将数据“分散”到那些地址,如果它从外设转移到内存。
答案 1 :(得分:6)
不,无法保证在C ++的抽象机器中为您提供连续的物理内存。 malloc
以下的抽象和硬件可以自由使用不连续的内存。
只有您的目标实施可以做出这样的保证,但语言/模型并不关心。它依靠系统来完成它的工作。
答案 2 :(得分:1)
虚拟到物理内存映射主要由CPU处理,但内核支持。用户空间进程无法知道此映射是什么:无论编程语言是什么,您的程序仅处理虚拟内存地址。如果跨越页面边界的两个相邻虚拟内存地址在物理内存中相邻,那么你不能指望,甚至找不到任何方法,因此绝对没有必要担心它。