堆和棧在物理上的區別

csu_zhengzy~發表於2018-08-29

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

 

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

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


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

 

相關文章