堆和棧在物理上的區別
多數情況下,堆應該算是作業系統抽象的、而棧由CPU直接提供支援(但作業系統可以決定應用程式棧大小的上限)。
從硬體上說,堆和棧最終都是記憶體條上的若干儲存單元,所以並沒有什麼不同。
但,由於很多CPU對壓棧、出棧操作有硬體(指令)上的支援,所以在棧區分配/歸還記憶體速度極快(相比之下,堆上分配簡直是龜速);尤其是函式內部的區域性變數,可以輕易與函式呼叫/返回繫結,因此幾乎所有編譯型語言都會在利用棧管理區域性變數(而且會優先使用空閒的暫存器,所以幾乎所有高階語言都是訪問區域性變數速度最快)。
不僅如此。由於棧記憶體分配/回收的特殊機制,使得同一函式內部的“區域性變數”總是分配在同一段連續記憶體空間上的;那麼引用這些區域性變數就不太容易出現CPU快取失效問題。但實際應用場景裡,這對程式效能的影響微乎其微,不必太過在意。
相關文章
- 堆和棧的區別
- java堆和棧的區別Java
- 堆和棧的概念和區別
- Java中堆和棧的區別Java
- 基礎——堆和棧的區別
- 堆(heap)和棧(stack)的區別
- 堆和棧的解釋和區別
- python堆和棧的區別有哪些Python
- C語言程式的內在分配:堆和棧以及char a[]和char*的區別C語言
- 記憶體分配策略中,堆和棧的區別記憶體
- 關於記憶體中棧和堆的區別記憶體
- 堆和棧的區別(轉過無數次的文章)
- 棧與堆的區別以及增長方向
- C#引用型別和值型別在堆、棧中的儲存C#型別
- 堆和棧在程式中的比較
- C#中堆和堆疊的區別C#
- JAVA堆區棧區方法區Java
- JAVA的堆和棧(轉)Java
- JavaScript理解堆和棧JavaScript
- JVM之棧、堆、方法區(三)JVM
- 記憶體四區之程式碼區,全域性區,棧區和堆區記憶體
- Java中棧和堆講解Java
- 如何正確理解棧和堆?
- C++中堆和棧的完全解析C++
- 關於堆區、棧區等五大區的終極分析
- 程式的記憶體分配:棧區(stack)堆區(heap)。。。(轉載)記憶體
- JavaScript 值型別和引用型別在堆疊中的存放JavaScript型別
- 簡單資料型別和引用資料型別對應棧和堆示意圖資料型別
- 【C#之棧和堆初遇】C#
- Jvm(27.14.2),理解升級---堆,棧,方法區JVM
- Java堆疊的區別有哪些Java
- Java記憶體區域總結(堆、棧、方法區等)Java記憶體
- .NET中的六個重要概念:棧、堆、值型別、引用型別、裝箱和拆箱型別
- 圖解C#的值型別,引用型別,棧,堆,ref,out圖解C#型別
- 棧(Stack) --- C# 自定義和微軟官方的區別C#微軟
- 全棧工程師和架構師的區別全棧工程師架構
- 物聯網路卡和手機卡的區別
- 【轉】.NET中的六個重要概念:棧、堆、值型別、引用型別、裝箱和拆箱型別