1 棧(stack)程序運行時由編譯器自動分配,存放函數的參數值,局部變量的值等。其操作方式類似於數據結構中的棧。程序結束時由編譯器自動釋放。
2 堆(heap)在內從中開闢另一片空間,由程序員自己分配,比如(new/delete),如果程序員自己在程序結束時不釋放開闢的空間, 操作系統也會釋放此空間, 但是有例外情況, 在此不詳述,後面的文章會講到。堆與數據結構中的鏈表類似, 並不是像數據結構中的堆。
3 靜態存儲區(全局區) 編譯器編譯時就會分配內存,全局變量和靜態變量存儲在同一片區域, 初始化的全局變量和靜態變量存在一片區域, 而沒有初始化的全局變量存儲在另一片區域。 程序結束時由系統統一釋放。
4 文字常量區 常量字符串就是放在這裏的。 程序結束後由系統釋放。
5 程序代碼區—存放函數體的二進制代碼。
對於這些解釋用下面的一個程序來說明:
#include <iostream>
int a = 0; //全局初始化區
char *p1; //全局未初始化區
int main()
{
int b; //棧
char s[] = "abc"; //棧
char *p2; //棧
char *p3 = "123456"; //123456在常量區,p3在棧上。
static int c =0;//全局(靜態)初始化區
p1 = new char[10];
p2 = new char[20];
//分配得來得和字節的區域就在堆區。
}
a 和*p1是全局變量所以存儲在靜態存儲區, 而b , s[],*p2, *p3爲局部變量都存儲在棧中, 而c雖是局部變量由於是static所以也存放在靜態存儲區(全局區),因爲它存在於全局變量中所以離開函數體時並不是立刻銷燬C, 當程序結束時才銷燬。
其中對於堆和棧有很大的區別, 在此簡單的總結以下:
1 管理方式不同: 棧是系統自動分配, 而對於堆來說申請釋放由用戶控制。
2 空間大小不同: 對於棧來說通常它的大小是固定的,只是對於不同的OS也許大小不同而已, 所以只要棧的剩餘空間大於所申請空間,系統將爲程序提供內存,否則 將報異常提示棧溢出。 而堆相對來說比較大, 它只受限於計算機內有效的虛擬內存。
所以比較靈活。
3 是否產生碎片不同: 由於new/delete的頻繁操作勢必會造成空間的浪費, 存在內存碎片, 而棧不會。
4 生長方向不同: 棧是向內存低地址方向延伸, 而堆是向內存高地址延伸。
5 分配方式效率不同: 由於棧是系統管理分配,所以效率會高一些。
堆和棧各有好處, 棧的效率高, 但是分配不靈活, 對於大內存需求無法滿足, 而堆分配靈活,效率低, 也容易造成內存碎片。
無論是堆還是棧都要防止越界, 因爲越界容易造成程序崩潰。
如果有錯誤請各位指出。謝謝!