堆和棧的區別:
1.申請方式
棧:由系統自動分配的,例如,聲明在一個函數中的一個局部變量int b,系統自動在棧中為b開辟空間。
堆:需要程序員自己申請,並指明大小,在C中用malloc函數。
如: p1=(char *)malloc(10);
在C++中,用new運算符,如:p2=(char *)malloc(10);
分配來的10字節的區域就在堆區。但是注意p1,p2本身是在棧中的。
2.申請後系統的響應
3.申請大小的限制
棧:是向低地址擴展的數據結構,一塊連續的內存的區域。
堆:是向高地址擴展的數據結構,是不連續的區域。
4.申請效率的比較
棧:由系統自動分配,速度較快。但程序員無法控制。
堆:是由new分配的內存,一般速度比較慢,且容易產生內存碎片,不過用起來最方便。
5.堆和棧中的存儲內容
棧:在函數調用的時候,第一個進棧的是主函數的下一條指令的地址,然後是函數的各個參數。靜態變量是不入棧的。當本次函數調用結束,局部變量先出棧,然後是參數,最後棧頂指針指向最開始存的地址。
堆:一般是在堆的頭部用一個字節存放堆的大小。堆中具體內容由程序員安排的。
6.存儲效率的比較:
在棧上的數組比指針所指向的字符串例如堆)快。
簡而言之:
heap是堆,stack是棧。
stack的空間是由系統自動分配和釋放的,heap上的空間需要手動分配和釋放的。
stack空間有限,heap是由很大的自由存儲區的。
stack從最高的地址開始的往上,heap從最低的地址開始往下
C中的malloc函數分配的內存空間即在堆上,C++對應的是new操作符。
程序在編譯期對變量和函數分配內存都在棧上進行的,而且程序運行過程中函數調用時參數的傳遞也在棧上進行的。
首先,我們舉一個例子:
void f(){
int* p=new int[5];}
這條短短的一句話就包含了堆與棧,看到new,我們首先就應該想到,我們分配了一塊堆內存,那麼指針p呢?他分配的是一塊棧內存,所以這句話的意思就是:在棧內存中存放了一個指向一塊堆內存的指針p。
本文出自 “IT民工一枚” 博客,請務必保留此出處http://7633061.blog.51cto.com/7623061/1266378