堆和棧的比較

2021-09-16 12:18:20 字數 658 閱讀 7743

在資料結構中有乙個堆疊的概念,是指棧,而不是堆和棧的統稱。堆和棧是採用動態儲存分配方式管理的記憶體區域。其中棧是在程式執行時由系統分配和**,而堆是通過程式設計師編寫的**,在程式執行時動態分配和**。下面從不同方面比較棧和堆的區別。

**記憶體分配方式和**方式不同:**棧由編譯器自動分配和釋放,用來存放函式的引數值、區域性變數的值等。而堆一般是由程式設計師分配釋放,若程式設計師不釋放,程式結束時可能由作業系統**。在c語言中,可通過malloc、free等函式操作堆。

**存放內容不同:**棧中主要存放函式呼叫中的引數、函式的區域性變數(靜態變數不如棧),通過棧才能完成函式之間呼叫時的現場儲存。而堆的存放內容沒有限制,由程式設計師安排。

**大小限制不同:**在dos、windows作業系統中,棧是由高位址向低位址擴充套件的資料結構,是一塊連續的記憶體的區域。也就是說,棧頂的位址和站的最大容量是由系統預先規定好的,如果申請的空間超過棧的剩餘空間時,將提示「堆疊溢位"。所以,棧的空間是有限的,例如,執行乙個無結束條件的遞迴呼叫時,可看到堆疊溢位的提示。而堆是由低位址向高位址擴充套件的資料結構,可以是不連續的記憶體區域。系統用鍊錶將這些不連續的空閒記憶體位址連線起來。堆的大小受限於計算機系統中有效的虛擬記憶體。所以,堆的空間很大,也比較靈活。

**效率不同:**棧是由系統自動分配,速度較快。而堆是由malloc等函式分配的記憶體,一般速度比較慢,而且容易產生記憶體碎片。

棧堆的emplace和push 棧和堆的詳解

private 作用範圍只能是自己本身 外界既不能訪問,也不能繼承 protected 作用範圍在自身類和子類,如果什麼都不加修飾,預設是這個 public作用範圍最大,可以在任何地方都可以訪問 外界既可以訪問,也可以繼承 package作用範圍在某個框架內 readwrite 預設 可讀可寫。表示...

堆和棧的區別

一直就搞不清出這個問題,今天上網想起來,隨即搜了搜,找到了一些資料。不知源作者是誰。姑且 拿來主義 一下,呵呵。一 預備知識 程式的記憶體分配 乙個由c c 編譯的程式占用的記憶體分為以下幾個部分 1 棧區 stack 由編譯器自動分配釋放 存放函式的引數值,區域性變數的值等。其操作方式類似於資料結...

堆和棧的區別

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