Rust的陣列是一整塊分配在棧上的記憶體, 這個說法正確嗎

時間 2021-06-02 21:50:15

1樓:山楂山楂片

補充一下dwing的回答。rust目前是真的分配在棧上的,然後有需要再box拷貝到堆上。這個拷貝可能通過返回值優化之類的東西來實現直接分配在堆上,但穩定版的語法確實不支援顯示地直接分配在堆上,不穩定版的不太清楚。

然後就題主說的問題。虛擬記憶體是連續的。但對映的物理記憶體是不一定連續的。

現代的通用CPU和現代作業系統都支援分頁。這會將虛擬記憶體對映到物理記憶體上。作業系統可以假裝為應用分配很大的記憶體,直到應用真的訪問了這塊記憶體,就會出現缺頁中斷,作業系統才會分配物理記憶體。

所以通常乙個程式的物理記憶體是零散的。

2樓:dwing

在當代的軟體領域, 單說"記憶體"基本上都是指"虛擬記憶體"了, 即使研究系統核心也很少涉及和關心最底層的物理記憶體, 甚至虛擬記憶體到物理記憶體的對映都是靠CPU硬體透明地轉換了, 軟體開發者幾乎不需要關注物理記憶體, 所以題主糾結"虛擬記憶體"和"物理記憶體"沒什麼意義.

教程裡"陣列是一整塊分配在棧上的記憶體"確實也有不嚴謹的地方, 就是陣列不一定分配在棧上, 否則就棧那點空間, 稍大點的陣列就容納不下了.

3樓:丟貓

不代表實體地址是連續的。但是對某個程式而言,只有虛擬記憶體位址才是有意義的,這裡說的棧就是指在虛擬記憶體位址空間上的棧。現代CPU有MMU單元,OS會在記憶體中維護頁表,頁表是虛擬記憶體位址到物理記憶體位址的對映。

CPU需要訪問記憶體的時候,MMU單元會查詢頁表尋找到虛擬記憶體位址對應的實際物理記憶體,應用對物理記憶體位址是無感知的。

4樓:

題主你需要了解的linux核心的記憶體管理機制,和語言的系統管理機制並分清楚它們不同的職能。

程式堆:ptmalloc jemalloc這些堆記憶體的管理。

程式棧:棧記憶體的分配在程式初始化的時候大小已經確定分配好了是一段連續的物理頁。

具體你說的一塊到底是分散物理頁面還是連續的物理頁那是核心記憶體管理上的事情,由程式對堆位址的申請使用系統呼叫引起的。

轎車的後排車窗為什麼不能用一整塊玻璃?

這是個很好的暱稱 本人是汽車玻璃安裝技師,不用一整塊1是為了視野2是因為讓公升降玻璃減少摩擦壽命更長3是更堅固。其實一整塊玻璃的車不是沒有比如起亞k2標誌206 207 孟良 這個問題,以前小時候也想過,後來在樓下修理廠看明白了。以前家門口的路是個斜坡,很多車起步都要後退一下,我還以為和我迴力車乙個...

女生發現胳膊上練出了一整塊的肌肉,不想變金剛芭比這該怎麼辦

demon08 這是肱二頭肌 肱二頭肌的訓練方法有以下幾種 1.彎舉 2.引體向上窄距反手為甚 3.划船 4.飛鳥 所以你避開這幾種動作就可以了 BatVan 關注點應該放在飲食上,排除充血的原因,肌肉一般只有在攝入大於消耗的時候才會增長,不然練的再多也練不大 這也是為什麼腸胃不好的人增肌困難 所以...

c 裡在堆上分配和使用多維陣列的最佳方法是什麼?

你知道的 on stack template size tI,size t J struct MultiDimArray template size t I struct MultiDimArray int main on heap namespace details template Tag us...