堆記憶體與棧內存在物理上的區別

2021-10-05 17:57:40 字數 550 閱讀 6284

多數情況下,堆記憶體是作業系統抽象的,而棧由cpu直接提供支援。從硬體上,堆和棧都是記憶體條上若干儲存單元,並沒有什麼不同。 但是很多cpu對壓棧出棧有指令上的支援,所以棧區分配/歸還記憶體速度極快(相比之下,堆極慢)。尤其在區域性變數上,可以輕易地與函式呼叫/返回繫結(作用域),因此幾乎所有編譯語言都利用棧來管理區域性變數。不僅如此,由於棧記憶體分配**機制,使得同意函式內部的「區域性變數」總是分配在一段連續的記憶體空間上;引用這些區域性變數就不太容易出現cpu快取失效的問題。

要點:物理上相同,堆是系統抽象的。但是棧記憶體快:①有cpu指令上的支援,②cpu快取使得訪問區域性變數變快。

記憶體區域不同:堆記憶體允許動態申請記憶體空間。棧記憶體定義一些基本型別扽變數和物件的引用。

特點不同:堆記憶體是優先佇列的一種資料結構,滿足先進後出的性質,棧記憶體訪問速度僅次於暫存器,棧資料可以共享。

範圍不同:堆記憶體需要手動進行適當,如果不釋放,會出現記憶體溢位的問題。棧記憶體會隨著變數的作用域分配和釋放。

參考:

棧記憶體與堆記憶體的區別

一 程式的記憶體分配 棧區 stack 有編譯器自動分配釋放,存放函式的引數,區域性變數等.堆區 heap 一般由程式設計師分配和釋放,否則就由 os 堆用於存放全域性變數,靜態變數,常量字串和函式 函式體的二進位制 二 申請後系統的響應 棧 只要棧的剩餘空間大於所申請的空間,系統將為程式提供記憶體...

堆記憶體與棧記憶體的區別

一 程式在編譯的時候占用的記憶體分為以下幾個部分 1 棧區 stack 由編譯器自動分配釋放 存放函式的引數值,區域性變數的值等。其操作方式類似於資料結構中的棧。棧記憶體分配運算內置於處理器的指令集中,效率很高,但是分配的記憶體容量有限.2 堆區 heap 亦稱動態記憶體分配.程式在執行的時候用ma...

棧記憶體與堆記憶體的區別

一 程式的記憶體分配 棧區 stack 有編譯器自動分配釋放,存放函式的引數,區域性變數等.堆區 heap 一般由程式設計師分配和釋放,否則就由 os 堆用於存放全域性變數,靜態變數,常量字串和函式 函式體的二進位制 二 申請後系統的響應 棧 只要棧的剩餘空間大於所申請的空間,系統將為程式提供記憶體...