堆與棧

來源:互聯網
上載者:User

標籤:棧   堆   

堆棧,堆棧,從一開始編程課的時候,老師就和我們在說,好的東西都放在棧裡,垃圾的東西放在堆裡,我一直不能完全理解,直到後來做了一些嵌入式的項目和上了一些課,有了一些自己的理解。

堆棧:分為堆和棧。

資料結構的角度來說:堆和棧分別屬於不同的資料結構,棧是一種特殊的線性結構,可以認為它是一種特殊的線性表,但是添加和刪除的方式比較特別,這個線性表只能從尾部添加(俗稱入棧),也必須從尾部刪除(出棧或彈棧),也就是所謂的先進後出。這個作用後面再說。而堆就不同了,堆是一種特殊的二叉樹,、是一個深度為h的樹,且滿足下列條件:1.從根到h-1層是一個完全二叉樹;2.任意節點都小於它的後裔,最小元在堆的根上(維基百科)。

從資料結構上說,這兩種就是不一樣了,棧是線性結構,而堆是樹形結構

但是我們在實際的操作時候,是對記憶體進行操作,所以從記憶體的角度,堆棧又和上面定義的有所不同。

從嵌入式c語言編程的角度,一般程式都放在flash中,而實際啟動並執行時候,都是在RAM中進行操作,所以一開始就需要在記憶體中分配空間,在一開始分配空間時候,先分配一些空間用於儲存全域變數,並分配一個棧的空間,這個棧的大小取決於記憶體的大小和分配策略。而堆就相當於後面記憶體中:除了常量區,代碼區,棧等之後的空閑地區。

下面一段代碼,可以比較簡單的看出來平時我們寫的變數一般寫在哪裡:

#include "stdafx.h"#include <iostream>using namespace std;int main(){int a = 0;  //a在棧裡char b = ' ';//b在棧裡static int c =0;//c在靜態區char *p1 = (char *)malloc(10); free(p1)//p1在堆上 return 0;}

所以棧(stack)和堆(heap)在記憶體上有以下不同:

第一點是分配空間上的不同,棧是系統分配空間,只要棧還有空間,系統就會分配,但是堆都是像記憶體中自動申請;

第二點就是釋放空間的不同,棧是系統自動釋放,而堆裡的東西需要程式員手動釋放,如果不釋放,會一直佔用記憶體空間。但是棧的分配空間小很多,如果寫一句,char a[10000]; 一般debug的時候都會報錯——棧溢出。而堆一般不會出現這種情況,因為堆是記憶體中閒置空間,一般系統會以鏈表的形式記錄下記憶體中閒置空間,所以不需要太在意記憶體空間不夠;

第三點是效率,可以分為訪問效率和儲存效率,在訪問效率方面:棧由系統分配,速度快,而堆訪問速度慢;在儲存方面,由於這涉及到記憶體與cache映射,堆一般是在二級cache中,棧一般用的是一級cache,硬體上的儲存速度就不一樣,然後是程式實際執行邏輯,堆用malloc,需要尋找閒置記憶體,而棧只需要沒有棧溢出,就可以直接儲存。


綜上,棧使用最方便,最無腦,別人幫你分配好一切(系統,編譯器),也珍貴(空間小,在範圍馬上就被回收);而堆比棧麻煩的多,唯一的好處是可以自己動態分配較大空間。這麼一來,還是真像以前那個C++老師說的那樣,好東西還真都是放在棧裡的。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.