1. 程式人生 > >iOS總結-記憶體的幾大區域

iOS總結-記憶體的幾大區域

參考: https://www.jianshu.com/p/de1418dc031a

1.棧區(stack)由編譯器自動分配並釋放,存放函式的引數值,區域性變數等.棧是系統資料結構,對應執行緒/進場是唯一的.優點快速高效缺點資料不靈活   先進後出

棧空間分靜態分配和動態分配兩種

靜態分配是編譯器完成的,比如自動變數(auto)的分配

動態分配由alloca函式完成

棧的動態分配無需釋放,是自動的,也就是沒有釋放函式,棧的動態分配操作是不被鼓勵的

2.堆區(heap)有程式設計師分配和釋放,如果程式設計師不釋放,程式結束時,可能會由作業系統回收,比如在ios中alloc都是存在堆中

優點靈活方便,資料適應面廣泛,但是效率有一定降低

堆是函式庫內部資料結構,不一定唯一. 不同堆分配的記憶體無法互相操作,堆空間的分配總是動態的.

雖然程式結束時所有的資料空間都會被釋放回系統,但是精確的申請記憶體,釋放記憶體匹配是良好程式的基本要素.

3.全域性區(靜態區 static) 全域性變數和靜態變數的儲存是放在一起的,初始化的全域性變數和靜態變數存放子啊一塊區域,未初始化的全域性變數和靜態變數在相鄰的另一塊區域,程式結束後由系統釋放.

全域性區分為未初始化區全域性區: .bss段和初始化全域性區: data段.      如: int a    未初始化    int a = 10; 已初始化的

4.文字常量區  存放常量字串    程式結束後由系統釋放

5.程式碼區   存放函式的二進位制程式碼

棧區 由編譯器自動分配釋放      區域性變數是儲存在棧區的   方法呼叫的實參也是儲存在棧區的

堆區  由程式設計師分配釋放,如程式設計師不釋放, 會出現記憶體洩漏, 使用new方法建立的物件  被建立物件的所有成員變數

BSS段/資料段/程式碼段  程式結束後由系統釋放

只要棧的剩餘空間大於申請空間,系統就提供記憶體,否則棧溢位

棧就是 去飯館吃飯, 只管點菜    

堆  是自己動手做飯