堆和棧在物理上的區別

2021-08-26 08:25:11 字數 381 閱讀 2707

多數情況下,堆應該算是作業系統抽象的、而棧由cpu直接提供支援(但作業系統可以決定應用程式棧大小的上限)。

從硬體上說,堆和棧最終都是記憶體條上的若干儲存單元,所以並沒有什麼不同。

但,由於很多cpu對壓棧、出棧操作有硬體(指令)上的支援,所以在棧區分配/歸還記憶體速度極快(相比之下,堆上分配簡直是龜速);尤其是函式內部的區域性變數,可以輕易與函式呼叫/返回繫結,因此幾乎所有編譯型語言都會在利用棧管理區域性變數(而且會優先使用空閒的暫存器,所以幾乎所有高階語言都是訪問區域性變數速度最快)。

不僅如此。由於棧記憶體分配/**的特殊機制,使得同一函式內部的「區域性變數」總是分配在同一段連續記憶體空間上的;那麼引用這些區域性變數就不太容易出現cpu快取失效問題。但實際應用場景裡,這對程式效能的影響微乎其微,不必太過在意。

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

多數情況下,堆記憶體是作業系統抽象的,而棧由cpu直接提供支援。從硬體上,堆和棧都是記憶體條上若干儲存單元,並沒有什麼不同。但是很多cpu對壓棧出棧有指令上的支援,所以棧區分配 歸還記憶體速度極快 相比之下,堆極慢 尤其在區域性變數上,可以輕易地與函式呼叫 返回繫結 作用域 因此幾乎所有編譯語言都利...

堆和棧區別

一 預備知識 程式的記憶體分配 乙個由c c 編譯的程式占用的記憶體分為以下幾個部分 1 棧區 stack 由編譯器自動分配釋放 存放函式的引數值,區域性變數的值等。其 操作方式類似於資料結構中的棧。2 堆區 heap 一般由程式設計師分配釋放,若程式設計師不釋放,程式結束時可能由os回 收 注意它...

堆和棧區別

管理方式 棧由編譯器自動管理 堆由程式設計師控制,使用方便,但易產生記憶體洩露。生長方向 棧向低位址擴充套件 即 向下生長 是連續的記憶體區域 堆向高位址擴充套件 即 向上生長 是不連續的記憶體區域。這是由於系統用鍊錶來儲存空閒記憶體位址,自然不連續,而鍊錶從低位址向高位址遍歷。空間大小 棧頂位址和...