棧:是一種連續儲存的資料結構,具有先進後出的性質。通常的操作有入棧(圧棧)、出棧和棧頂元素。想要讀取棧中的某個元素,就要將其之前的所有元素出棧才能完成。模擬現實中的箱子一樣。
堆:是一種非連續的樹形儲存資料結構,每個節點有乙個值,整棵樹是經過排序的。特點是根結點的值最小(或最大),且根結點的兩個子樹也是乙個堆。常用來實現優先佇列,訪問隨意。
一般說到記憶體,指的是計算機的隨機儲存器(ram),程式都在這裡面執行。計算機記憶體的大致劃分如下圖所示:
棧記憶體:由程式自動向作業系統申請分配以及**,速度快,使用方便,但程式設計師無法控制。若分配失敗,則提示棧溢位錯誤。注意,const區域性變數也儲存在棧區內,棧區向位址減小的方向增長。
//測試棧記憶體測試輸出為:#include int main()
&i3 < &i2 < &i,證明位址是減小的。
堆記憶體:程式設計師向作業系統申請一塊記憶體,當系統收到程式的申請時,會遍歷乙個記錄空閒記憶體位址的鍊錶,尋找第乙個空間大於所申請空間的堆結點,然後將該結點從空閒結點鍊錶中刪除,並將該結點的空間分配給程式。分配的速度較慢,位址不連續,容易碎片化。此外,由程式設計師申請,同時也必須由程式設計師負責銷毀,否則則導致記憶體洩露。
//測試堆記憶體和棧記憶體的區別測試輸出為:#include int main()
執行多次後會發現pi所指向的位址並不連續,是跳躍式的;而&si是一致的,儲存在可讀寫區;前三個變數都儲存在棧區,由程式自動分配和銷毀。
堆和棧的區別可以引用一位前輩的比喻來看出:
使用棧就象我們去飯館裡吃飯,只管點菜(發出申請)、付錢、和吃(使用),吃飽了就走,不必理會切菜、洗菜等準備工作和洗碗、刷鍋等掃尾工作,他的好處是快捷,但是自由度小。
使用堆就象是自己動手做喜歡吃的菜餚,比較麻煩,但是比較符合自己的口味,而且自由度大。
記憶體中堆和棧的區別
原文 在計算機領域,堆疊是乙個不容忽視的概念,我們編寫的c語言程式基本上都要用到。但對於很多的初學著來說,堆疊是乙個很模糊的概念。堆疊 一種資料結構 乙個在程式執行時用於存放的地方,這可能是很多初學者的認識,因為我曾經就是這麼想的和組合語言中的堆疊一詞混為一談。我身邊的一些程式設計的朋友以及在網上看...
記憶體堆和棧的區別
在計算機領域,堆疊是乙個不容忽視的概念,我們編寫的c語言程式基本上都要用到。但對於很多的初學著來說,堆疊是乙個很模糊的概念。堆疊 一種資料結構 乙個在程式執行時用於存放的地方,這可能是很多初學者的認識,因為我曾經就是這麼想的和組合語言中的堆疊一詞混為一談。我身邊的一些程式設計的朋友以及在網上看帖遇到...
記憶體堆和棧的區別
原文 在計算機領域,堆疊是乙個不容忽視的概念,我們編寫的c語言程式基本上都要用到。但對於很多的初學著來說,堆疊是乙個很模糊的概念。堆疊 一種資料結構 乙個在程式執行時用於存放的地方,這可能是很多初學者的認識,因為我曾經就是這麼想的和組合語言中的堆疊一詞混為一談。我身邊的一些程式設計的朋友以及在網上看...