簡體   English   中英

std :: vector元素在物理內存中是連續的嗎?

[英]Are std::vector elements contiguous in physical memory?

我的問題與類似,但我問的是有點不同。

很明顯,可以將第一個std::vector元素的地址用作C類型數組。 這意味着在虛擬內存中, std::vector元素是連續的。 但是,如果物理內存是碎片化的,則std::vector實際上可能會分成物理內存中的許多部分。

我的問題是: std::vector元素在物理內存(以及虛擬內存)中是連續的嗎?

用於在向量中存儲數據的存儲器必須位於連續的地址,因為這些地址對於代碼是可見的。

在大多數現代CPU /操作系統的典型情況下,這意味着虛擬地址必須是連續的。 如果這些虛擬地址跨越頁面邊界,那么物理地址很可能不再是連續的。

我應該補充一點,這很少是一個主要問題。 在許多情況下,現代系統至少對這種分散的內存使用有一定的支持,直到硬件級別。 例如,許多網絡和磁盤控制器都包含“分散/聚集”功能,其中操作系統使用頁表將緩沖區的虛擬地址轉換為物理地址,然后直接向控制器提供多個物理地址,然后控制器收集來自這些地址的數據,如果它從內存轉移到外設或者將數據“分散”到這些地址,如果它從外設轉移到內存。

不,不能保證你會在C ++的抽象機器中提供連續的物理內存。 malloc下面的抽象和硬件可以自由使用不連續的內存。

只有您的目標實施可以做出這樣的保證,但語言/模型並不關心。 它依靠系統來完成它的工作。

虛擬到物理內存映射主要由CPU處理,但內核支持。 用戶空間進程無法知道此映射是什么:無論編程語言是什么,您的程序僅處理虛擬內存地址。 如果跨越頁面邊界的兩個相鄰虛擬內存地址在物理內存中相鄰,那么您無法預料甚至找不到任何方法,因此絕對沒有必要擔心它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM