轉(zhuǎn)自: iOS程序中的內(nèi)存分配 棧區(qū)堆區(qū)全局區(qū)
在計算機系統(tǒng)中,運行的應用程序的數(shù)據(jù)都是保存在內(nèi)存中的,不同類型的數(shù)據(jù),保存的內(nèi)存區(qū)域不同。
一、內(nèi)存分區(qū)
1 棧區(qū)(stack)
由編譯器自動分配并釋放,存放函數(shù)的參數(shù)值,局部變量等。棧是系統(tǒng)數(shù)據(jù)結(jié)構(gòu),對應線程/進程是唯一的。
優(yōu)點是快速高效,缺點時有限制,數(shù)據(jù)不靈活。[先進后出]
??臻g分靜態(tài)分配 和動態(tài)分配兩種。
- 靜態(tài)分配是編譯器完成的,比如自動變量(auto)的分配。
- 動態(tài)分配由alloc函數(shù)完成。
棧的動態(tài)分配無需釋放(是自動的),也就沒有釋放函數(shù)。 為可移植的程序起見,棧的動態(tài)分配操作是不被鼓勵的!
2 堆區(qū)(heap)
由程序員分配和釋放,如果程序員不釋放,程序結(jié)束時,可能會由操作系統(tǒng)回收 ,比如在ios 中 alloc 都是存放在堆中。
優(yōu)點是靈活方便,數(shù)據(jù)適應面廣泛,但是效率有一定降低。[順序隨意]
堆是函數(shù)庫內(nèi)部數(shù)據(jù)結(jié)構(gòu),不一定唯一。
不同堆分配的內(nèi)存無法互相操作。
堆空間的分配總是動態(tài)的
雖然程序結(jié)束時所有的數(shù)據(jù)空間都會被釋放回系統(tǒng),但是精確的申請內(nèi)存,釋放內(nèi)存匹配是良好程序的基本要素。
3 全局區(qū)(靜態(tài)區(qū)) (static)
全局變量和靜態(tài)變量的存儲是放在一起的,初始化的全局變量和靜態(tài)變量存放在一塊區(qū)域,未初始化的全局變量和靜態(tài)變量在相鄰的另一塊區(qū)域,程序結(jié)束后有系統(tǒng)釋放。
注意:全局區(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ū)
存放常量字符串,程序結(jié)束后由系統(tǒng)釋放
5程序代碼區(qū)
存放函數(shù)的二進制代碼