iOS中的堆 heap 和棧 stack 的理解

2021-08-27 02:15:54 字數 1797 閱讀 5003

作業系統ios 中應用程式使用的計算機記憶體不是統一分配空間,執行**使用的空間在三個不同的記憶體區域,分成三個段:「text segment 「,「stack segment 」,「heap segment 」。

段「text segment 」是應用程式執行時應用程式**存在的記憶體段。每乙個指令,每乙個單個函式、過程、方法和執行**都存在這個記憶體段中直到應用程式退出。一般情況下,你不會真的不得不知道這個段的任何事情。

當應用開始以後,函式main() 被呼叫,一些空間分配在」stack」 中。這是為應用分配的另乙個段的記憶體空間,這是為了函式變數儲存需要而分配的記憶體。每一次在應用中呼叫乙個函式,「stack 」的一部分會被分配在」stack」 中,稱之為」frame」 。新函式的本地變數分配在這裡。

正如名稱所示,「stack 」是後進先出(lifo )結構。當函式呼叫其他的函式時,「stack frame 」會被建立;當其他函式退出後,這個「frame 」會自動被破壞。

「heap」 段也稱為」data」 段,提供乙個儲存中介貫穿函式的執行過程,全域性和靜態變數儲存在「heap 」中,直到應用退出。

為了訪問你建立在heap 中的資料,你最少要求有乙個儲存在stack 中的指標,因為你的cpu 通過stack 中的指標訪問heap 中的資料。

你可以認為stack 中的乙個指標僅僅是乙個整型變數,儲存了heap 中特定記憶體位址的資料。實際上,它有一點點複雜,但這是它的基本結構。

簡而言之,作業系統使用stack 段中的指標值訪問heap 段中的物件。如果stack 物件的指標沒有了,則heap 中的物件就不能訪問。這也是記憶體洩露的原因。

在ios 作業系統的stack 段和heap 段中,你都可以建立資料物件。

stack 物件的優點主要有兩點,一是建立速度快,二是管理簡單,它有嚴格的生命週期。stack 物件的缺點是它不靈活。建立時長度是多大就一直是多大,建立時是哪個函式建立的,它的owner 就一直是它。不像heap 物件那樣有多個owner ,其實多個owner 等同於引用計數。只有heap 物件才是採用「引用計數」方法管理它。

stack 物件的建立

只要棧的剩餘空間大於stack 物件申請建立的空間,作業系統就會為程式提供這段記憶體空間,否則將報異常提示棧溢位。

heap 物件的建立

作業系統對於記憶體heap 段是採用鍊錶進行管理的。作業系統有乙個記錄空閒記憶體位址的鍊錶,當收到程式的申請時,會遍歷鍊錶,尋找第乙個空間大於所申請的heap 節點,然後將該節點從空閒節點鍊錶中刪除,並將該節點的空間分配給程式。

例如:

nsstring 的物件就是stack 中的物件,nsmutablestring 的物件就是heap 中的物件。前者建立時分配的記憶體長度固定且不可修改;後者是分配記憶體長度是可變的,可有多個owner, 適用於計數管理記憶體管理模式。

兩類物件的建立方法也不同,前者直接建立「nsstring * str1=@"welcome"; 「,而後者需要先分配再初始化「nsmutablestring * mstr1=[[nsmutablestring alloc] initwithstring:@"welcome"]; 」。

再補充一點,這裡說的是作業系統的堆和棧。

在我們學習「資料結構」時,接觸到的堆和棧的概念和這個作業系統中的堆和棧不是一回事的。

作業系統的堆和棧是指對記憶體進行操作和管理的一些方式。

「資料結構「的堆實際上指的就是(滿足堆性質的)優先queue 的一種資料結構,第1 個元素有最高的優先權;棧實際上就是滿足先進後出的性質的資料或資料結構。

iOS中的堆 heap 和棧 stack 的理解

作業系統ios 中應用程式使用的計算機記憶體不是統一分配空間,執行 使用的空間在三個不同的記憶體區域,分成三個段 text segment stack segment heap segment 段 text segment 是應用程式執行時應用程式 存在的記憶體段。每乙個指令,每乙個單個函式 過程 ...

iOS 堆 heap 和棧 stack 的理解

2013 05 17 15 38 佚名 oschina 字型大小 t t 作業系統ios 中應用程式使用的計算機記憶體不是統一分配空間,執行 使用的空間在三個不同的記憶體區域,分成三個段 text segment stack segment heap segment ad wot2015 網際網路運...

Java中Heap 堆 和Stack 棧

heap 堆 1 heap是stack的子集。2 heap是執行時可動態分配的資料區,從速度看比stack慢,heap裡面的資料不共享,大小和生存期都可以在執行時再確定。3 new關鍵字 是執行時在heap裡面建立物件。每new一次都一定會建立新物件,因為堆資料不共享。stack 棧 stack訪問...