堆區和棧區的區別


一、區別

注:首先堆和棧可以分為兩種,一種是數據結構,另一種是和內存的分配有關,這兩種雖然都有棧和堆,但是兩者關系並不大,

 

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM