1. 程式人生 > >c++ 堆和棧以及區別

c++ 堆和棧以及區別

一個地方 靜態 數據 也有 程序員 first .cn 特點 strcpy

c++中內存分成5個區:堆、棧、自由存儲區、全局\靜態存儲區、常量存儲區

棧是一種連續存儲的數據結構,具有先進後出的性質。堆是一種非連續的樹形存儲數據結構,每個節點有一個值,整棵樹是經過排序的,特點是根節點的值最小(或最大),且根節點的兩個子樹也是一個堆。

//main.cpp 
int a = 0; // 全局初始化區 
char *p1;  // 全局未初始化區 
main() 
{ 
    int b; //
    char s[] = "abc"; //
    char *p2; //
    char *p3 = "123456"; // 123456在常量區,p3在棧上。 
    static
int c =0// 全局(靜態)初始化區 p1 = (char *)malloc(10); p2 = (char *)malloc(20); // 分配得來的10和20個字節的區域在堆區,p1、p2指針變量本身在棧內。 strcpy(p1, "123456"); // 123456放在常量區,編譯器可能會將它與p3所指向的"123456"優化成一個地方。 }

堆和棧的區別:

(1)管理方式:堆中資源由程序員控制(通過malloc/free、new/delete,容易產生memory leak),如果程序員沒有釋放掉,資源將由操作系統在程序結束後自動回收。棧資源由編譯器在需要時自動分配,不需要時自動清除的變量存儲區,通常存放局部變量、函數參數等。 (2)系統響應:對於堆,系統有一個記錄空閑內存地址的鏈表,當系統收到程序申請時,遍歷該鏈表,尋找第一個大於所申請空間的空間的堆結點,刪除空閑結點鏈表中的該結點,並將該結點空間分配給程序(大多數系統會在這塊內存空間首地址記錄本次分配的大小,這樣delete才能正確釋放本內存空間,另外,系統會將多余的部分重新放入空閑鏈表中)。對於棧,只要棧的剩余空間大於所申請空間,系統就會為程序分配內存,否則報異常出現棧空間溢出錯誤。 (3)空間大小:堆是不連續的內存區域(因為系統是用鏈表來存儲空閑內存地址的,自然不是連續),堆的大小受限於計算機系統中有效的虛擬內存(32位機器上理論上是4G大小),所以堆的空間比較靈活,比較大。棧是一塊連續的內存區域,大小是操作系統預定好的,windows下棧大小是2M(也有是1M,在編譯時確定,VC中可設置)。 (4)碎片問題:對於堆,頻繁的new/delete會造成大量內存碎片,降低程序效率。對於棧,它是一個先進後出(first-in-last-out)的結構,進出一一對應,不會產生碎片。 (5)分配效率:堆由C/C++函數庫提供,機制很復雜,因此堆的效率比棧低很多。棧是機器系統提供的數據結構,計算機在底層對棧提供支持,分配專門的寄存器存放棧地址,提供棧操作專門的指令。 http://www.cnblogs.com/yiluyisha/p/9049051.html

c++ 堆和棧以及區別