[英]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.