堆和棧在物理上的區別
多數情況下,堆應該算是作業系統抽象的、而棧由CPU直接提供支援(但作業系統可以決定應用程式棧大小的上限)。
從硬體上說,堆和棧最終都是記憶體條上的若干儲存單元,所以並沒有什麼不同。
但,由於很多CPU對壓棧、出棧操作有硬體(指令)上的支援,所以在棧區分配/歸還記憶體速度極快(相比之下,堆上分配簡直是龜速);尤其是函式內部的區域性變數,可以輕易與函式呼叫/返回繫結,因此幾乎所有編譯型語言都會在利用棧管理區域性變數(而且會優先使用空閒的暫存器,所以幾乎所有高階語言都是訪問區域性變數速度最快)。
不僅如此。由於棧記憶體分配/回收的特殊機制,使得同一函式內部的“區域性變數”總是分配在同一段連續記憶體空間上的;那麼引用這些區域性變數就不太容易出現CPU快取失效問題。但實際應用場景裡,這對程式效能的影響微乎其微,不必太過在意。
相關文章
- 堆和棧的概念和區別
- 堆和棧的解釋和區別
- python堆和棧的區別有哪些Python
- 記憶體分配策略中,堆和棧的區別記憶體
- 棧與堆的區別以及增長方向
- C#引用型別和值型別在堆、棧中的儲存C#型別
- Python中堆、棧、佇列之間的區別Python佇列
- JAVA堆區棧區方法區Java
- JavaScript理解堆和棧JavaScript
- 記憶體四區之程式碼區,全域性區,棧區和堆區記憶體
- JVM之棧、堆、方法區(三)JVM
- C++中堆和棧的完全解析C++
- 如何正確理解棧和堆?
- Java中棧和堆講解Java
- Jvm(27.14.2),理解升級---堆,棧,方法區JVM
- 在K8S中,cailico的ipip模型和ciliume的vxlan模型除了在具體的實現不同,在原理上有何區別?K8SAI模型
- 全棧工程師和架構師的區別全棧工程師架構
- 簡單資料型別和引用資料型別對應棧和堆示意圖資料型別
- Java堆疊的區別有哪些Java
- Java記憶體區域總結(堆、棧、方法區等)Java記憶體
- viewflow在html和body的區別ViewHTML
- 物聯網路卡和手機卡的區別
- 記憶體中發堆和棧,棧是執行時的單位,而堆是儲存的單位記憶體
- 棧(Stack) --- C# 自定義和微軟官方的區別C#微軟
- 在xpath中text()和string(.)的區別
- javascript堆疊記憶體分配的區別JavaScript記憶體
- C++基礎-1-記憶體管理(全域性區、堆區、棧區)C++記憶體
- 堆、棧以及佇列佇列
- 劫持TLS繞過canary && 堆和棧的靈活轉換TLS
- 在C++中申請堆區空間與在C中申請堆區空間的異同點C++
- 介面和列舉在方法中的區別
- NULL在oracle和mysql索引上的區別NullOracleMySql索引
- JavaScript中記憶體使用規則--堆和棧JavaScript記憶體
- 在 JavaScript 中,exec() 和 match() 區別JavaScript
- go區域性變數的儲存空間是堆還是棧?Go變數
- ../和./和/的區別
- C#以及其他語言環境下的堆和棧C#
- LinkedList和ArrayList的區別、Vector和ArrayList的區別