堆和棧的區別

2021-07-15 08:45:57 字數 1532 閱讀 3387

堆(heap)和棧(stack)的區別

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

堆和棧區別

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

堆和棧區別

管理方式 棧由編譯器自動管理 堆由程式設計師控制,使用方便,但易產生記憶體洩露。生長方向 棧向低位址擴充套件 即 向下生長 是連續的記憶體區域 堆向高位址擴充套件 即 向上生長 是不連續的記憶體區域。這是由於系統用鍊錶來儲存空閒記憶體位址,自然不連續,而鍊錶從低位址向高位址遍歷。空間大小 棧頂位址和...

堆和棧區別

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