iOS記憶體分配

2021-07-10 04:18:34 字數 1870 閱讀 3014

一、記憶體分割槽

棧區(stack) 由編譯器自動分配並釋放,存放函式的引數值,區域性變數等。棧是系統資料結構,對應執行緒/程序是唯一的。

優點是快速高效,缺點時有限制,資料不靈活。[先進後出]

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

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

動態分配由alloca函式完成。

棧的動態分配無需釋放(是自動的),也就沒有釋放函式。

為可移植的程式起見,棧的動態分配操作是不被鼓勵的!

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

優點是靈活方便,資料適應面廣泛,但是效率有一定降低。[順序隨意]

堆是函式庫內部資料結構,不一定唯一。

不同堆分配的記憶體無法互相操作。

堆空間的分配總是動態的

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

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

注意:全域性區又可分為未初始化全域性區:

.bss段和初始化全域性區:data段。

舉例:int a;未初始化的。int a = 10;已初始化的。

例子**:

int a = 10;  全域性初始化區

char *p; 全域性未初始化區

main

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

程式**區 存放函式的二進位制**

二、申請後的系統響應

棧:儲存每乙個函式在執行的時候都會向作業系統索要資源,棧區就是函式執行時的記憶體,棧區中的變數由編譯器負責分配和釋放,記憶體隨著函式的執行分配,隨著函式的結束而釋放,由系統自動完成。

注意:只要棧的剩餘空間大於所申請空間,系統將為程式提供記憶體,否則將報異常提示棧溢位。

堆:1.首先應該知道作業系統有乙個記錄空閒記憶體位址的鍊錶。

2.當系統收到程式的申請時,會遍歷該鍊錶,尋找第乙個空間大於所申請空間的堆結點,然後將該結點從空閒結點鍊錶中刪除,並將該結點的空間分配給程式。

3 .由於找到的堆結點的大小不一定正好等於申請的大小,系統會自動的將多餘的那部分重新放入空閒鍊錶中

三、 申請大小的限制

棧:棧是向低位址擴充套件的資料結構,是一塊連續的記憶體的區域。是棧頂的位址和棧的最大容量是系統預先規定好的,棧的大小是2m(也有的說是1m,總之是乙個編譯時就確定的常數 ) ,如果申請的空間超過棧的剩餘空間時,將提示overflow。因此,能從棧獲得的空間較小。

堆:堆是向高位址擴充套件的資料結構,是不連續的記憶體區域。這是由於系統是用鍊錶來儲存的空閒記憶體位址的,自然是不連續的,而鍊錶的遍歷方向是由低位址向高位址。堆的大小受限於計算機系統中有效的虛擬記憶體。由此可見,堆獲得的空間比較靈活,也比較大。

記憶體分配.png

棧:由系統自動分配,速度較快,不會產生記憶體碎片

堆:是由alloc分配的記憶體,速度比較慢,而且容易產生記憶體碎片,不過用起來最方便

打個比喻來說:

使用棧就象我們去飯館裡吃飯,只管點菜(發出申請)、付錢、和吃(使用),吃飽了就走,不必理會切菜、洗菜等準備工作和洗碗、刷鍋等掃尾工作,他的好處是快捷,但是自由度小。

使用堆就象是自己動手做喜歡吃的菜餚,比較麻煩,但是比較符合自己的口味,而且自由度大。

ios記憶體分配

記憶體分割槽 1 棧區 stack 由編譯器自動分配釋放 存放函式的引數值,區域性變數的值等。其操作方式類似於資料結構中的棧。2 堆區 heap 一般由程式設計師分配釋放,若程式設計師不釋放,程式結束時可能由os ios中alloc都是存放在堆中 3 全域性區 靜態區 static 全域性變數和靜態...

IOS中記憶體的分配

記憶體分割槽 1 棧區 stack 由編譯器自動分配釋放 存放函式的引數值,區域性變數的值等。其操作方式類似於資料結構中的棧。2 堆區 heap 一般由程式設計師分配釋放,若程式設計師不釋放,程式結束時可能由os ios中alloc都是存放在堆中 3 全域性區 靜態區 static 全域性變數和靜態...

iOS開發 記憶體管理之記憶體分配

下面舉個例子說明下 nsstring string string nsstring alloc initwithstring hello ios 這裡string其實就是乙個指標,oc中除了基本資料型別之外的變數型別都是指標型別,oc物件都是通過指標進行操作的。第一段 定義了nsstring型別的指...