iOS 堆 heap 和棧 stack 的理解

2021-06-30 16:26:07 字數 2081 閱讀 2724

2013-05-17 15:38 佚名 oschina 

字型大小:t

|  t

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

ad:wot2015 網際網路運維與開發者大會 熱銷搶票

objective-c的物件在記憶體中是以堆的方式分配空間的,並且堆記憶體是由你釋放的,即release

棧由編譯器管理自動釋放的,在方法中(函式體)定義的變數通常是在棧內,因此如果你的變數要跨函式的話就需要將其定義為成員變數。

1.棧區(stack):由編譯器自動分配釋放,存放函式的引數值,區域性變數等值。其操作方式類似於資料結構中的棧。

2.堆區(heap):一般由程式設計師分配釋放,若程式設計師不釋放,則可能會引起記憶體洩漏。注堆和資料結構中的堆疊不一樣,其類是與鍊錶。

作業系統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"]; 」。

堆 heap 和棧 stack 轉

stack和heap的區別 一 預備知識 程式的記憶體分配 乙個由c c 編譯的程式占用的記憶體分為以下幾個部分 1 棧區 stack 由編譯器自動分配釋放 存放函式的引數值,區域性變數的值等。其操作方式類似於資料結構中的棧。2 堆區 heap 一般由程式設計師分配釋放,若程式設計師不釋放,程式結束...

堆(Heap)和棧(Stack)的區別

五大記憶體分割槽 在c 中,記憶體分成5個區,他們分別是堆 棧 自由儲存區 全域性 靜態儲存區和常量儲存區。棧,就是那些由編譯器在需要的時候分配,在不需要的時候自動清楚的變數的儲存區。裡面的變數通常是區域性變數 函式引數等。堆,就是那些由new分配的記憶體塊,他們的釋放編譯器不去管,由我們的應用程式...

堆(Heap)和棧(Stack 轉 整理

一 程式的記憶體分配 1 棧區 stack 由編譯器自動分配釋放 2 堆區 heap 一般由程式設計師分配釋放,若程式設計師不釋放,程式結束時可能由os 注意它與資料結構中的堆是兩回事,分配方式倒是類似於鍊錶 3 全域性區 靜態區 static 全域性變數和靜態變數的儲存是放在一塊的,初始化的全域性...