一、區別
注:首先堆和棧可以分為兩種,一種是數據結構,另一種是和內存的分配有關,這兩種雖然都有棧和堆,但是兩者關系並不大,
c語言的內存模型分為五個區,分別為:堆區(heap)、棧區(stack)、靜態區、常量區、代碼區、
棧區和代碼區其實是一個區。下面這個圖就很明了。

棧區主要存儲變量、引用,比如int x;bool y;等等,
存區速度較快,因為他存儲的都是一些比較簡單的數據,而且他本身的數據接口也比較簡單。存儲的內容會隨着方法的執行完成被銷毀
每個線程都有一個棧
垃圾回收較為頻繁,因為主要是存方法,方法結束那方法中的引用就結束了
堆主要存儲的是實例對象,比如new 一個對象,
存取速度比較慢,因為堆內存要在程序運行時動態分配內存。存儲的內容有程序員自己銷毀,如果程序執行完成還沒有銷毀,就自動銷毀。
而所有線程共享一個堆
垃圾回收不頻繁,只有在一定條件下比如不夠用了才會回收
可以來一段c++代碼對比一下
1 #include<iostream> 2 using namespace std; 3 int * function(){ 4 int a = 1 #在這里會給變量分配棧內存 5 return &a; 6 7 } 8 int main(){ 9 int *p = function(); #當方法運行完成后,變量就被銷毀了 10 cout<<*P<<end1; #所以輸出的*P為亂碼 11 cout<<*p<<end1; 12 return 0; 13 }
要取到a的值,可以new一個對象,
1 #include<iostream> 2 using namespace std; 3 int * function(){ 4 int *a = new int (1) #調用對象把a存在了堆區,方法運行后並不會被立即清理 5 return a; 6 7 } 8 int main(){ 9 int *p = function(); # 10 cout<<*P<<end1; #所以輸出a的值1 11 cout<<*p<<end1; 12 return 0; 13 }
二、數據結構中的棧和堆
什么是數據結構?
存儲與組織數據的方式。我感覺更應強調數據的組織方式,比如好多數據結構的存儲方式都是用的數組,但他們根據自身的特點進行了封裝,因為存儲方式只有順序存儲和鏈式存儲兩種,但是卻可以組合成多種數據結構。
常用的數據結構有哪些?
數組、棧、圖、堆、隊列、鏈表等等。
棧
棧是限定僅僅在表尾進行插入和刪除操作的線性表,把允許插入和刪除的一端稱之為棧頂,另外一端稱之為棧底。特點:后進先出,稱之為后進先出線性表。
棧的應用:遞歸。
堆
是一種經過排序的樹形數據結構,每一個節點都有一個值,通常所說堆的數據結構是二叉樹,堆的存取是隨意的。所以堆在數據結構中通常可以被看做是一棵樹的數組對象。而且堆需要滿足一下兩個性質:
(1)堆中某個節點的值總是不大於或不小於其父節點的值;
(2)堆總是一棵完全二叉樹。
堆的應用:堆排序,快速找出最大值、最小值,簡化時間復雜度,像這樣支持插入元素和尋找最大(小)值元素的數據結構稱之為優先隊列。
————————————————
原文鏈接:https://blog.csdn.net/panjiapengfly/article/details/102665381
