轉自: iOS程序中的內存分配 棧區(qū)堆區(qū)全局區(qū)
在計算機系統中,運行的應用程序的數據都是保存在內存中的,不同類型的數據,保存的內存區(qū)域不同。
一、內存分區(qū)
1 棧區(qū)(stack)
由編譯器自動分配并釋放,存放函數的參數值,局部變量等。棧是系統數據結構,對應線程/進程是唯一的。
優(yōu)點是快速高效,缺點時有限制,數據不靈活。[先進后出]
棧空間分靜態(tài)分配 和動態(tài)分配兩種。
- 靜態(tài)分配是編譯器完成的,比如自動變量(auto)的分配。
- 動態(tài)分配由alloc函數完成。
棧的動態(tài)分配無需釋放(是自動的),也就沒有釋放函數。 為可移植的程序起見,棧的動態(tài)分配操作是不被鼓勵的!
2 堆區(qū)(heap)
由程序員分配和釋放,如果程序員不釋放,程序結束時,可能會由操作系統回收 ,比如在ios 中 alloc 都是存放在堆中。
優(yōu)點是靈活方便,數據適應面廣泛,但是效率有一定降低。[順序隨意]
堆是函數庫內部數據結構,不一定唯一。
不同堆分配的內存無法互相操作。
堆空間的分配總是動態(tài)的
雖然程序結束時所有的數據空間都會被釋放回系統,但是精確的申請內存,釋放內存匹配是良好程序的基本要素。
3 全局區(qū)(靜態(tài)區(qū)) (static)
全局變量和靜態(tài)變量的存儲是放在一起的,初始化的全局變量和靜態(tài)變量存放在一塊區(qū)域,未初始化的全局變量和靜態(tài)變量在相鄰的另一塊區(qū)域,程序結束后有系統釋放。
注意:全局區(qū)又可分為未初始化全局區(qū):
.bss段和初始化全局區(qū):data段。
舉例:int a;未初始化的。int a = 10;已初始化的。
例子代碼:
int a = 10; 全局初始化區(qū)
char *p; 全局未初始化區(qū)
main{
int b; 棧區(qū)
char s[] = "abc" 棧
char *p1; 棧
char *p2 = "123456"; 123456\\\\0在常量區(qū),p2在棧上。
static int c =0; 全局(靜態(tài))初始化區(qū)
w1 = (char *)malloc(10);
w2 = (char *)malloc(20);
分配得來得10和20字節(jié)的區(qū)域就在堆區(qū)。
}
4 文字常量區(qū)
存放常量字符串,程序結束后由系統釋放
5程序代碼區(qū)
存放函數的二進制代碼