std::矢量元素在物理内存中是否连续



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

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

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

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

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

我要补充一点,这很少是一个主要问题。在许多情况下,现代系统至少在一定程度上支持这种碎片化的内存使用,一直到硬件级别。例如,许多网络和磁盘控制器都具有"分散/聚集"功能,操作系统使用页表将缓冲区的虚拟地址转换为物理地址,然后直接向控制器提供多个物理地址,如果从存储器传输到外围设备,它会从这些地址收集数据,如果从外围设备传输到存储器,它会将数据"分散"到这些地址。

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

只有您有针对性的实现才能做出这样的保证,但语言/模型并不在乎。它依靠系统来完成它的工作。

虚拟到物理内存的映射主要由CPU处理,但有内核支持。userland进程无法知道这种映射是什么:无论编程语言是什么,您的程序都只处理虚拟内存地址。如果跨越页面边界的两个相邻虚拟内存地址在物理内存中是相邻的,你无法预料,也没有任何方法可以发现,所以绝对没有必要担心它。

最新更新