国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計 > 正文

iOS中的堆(heap)和棧(stack)的理解

2019-11-14 19:54:14
字體:
供稿:網(wǎng)友

操作系統(tǒng)iOS 中應(yīng)用程序使用的計算機(jī)內(nèi)存不是統(tǒng)一分配空間,運(yùn)行代碼使用的空間在三個不同的內(nèi)存區(qū)域,分成三個段:“text segment “,“stack segment ”,“heap segment ”。

 

段“text segment ”是應(yīng)用程序運(yùn)行時應(yīng)用程序代碼存在的內(nèi)存段。每一個指令,每一個單個函數(shù)、過程、方法和執(zhí)行代碼都存在這個內(nèi)存段中直到應(yīng)用程序退出。一般情況下,你不會真的不得不知道這個段的任何事情。

當(dāng)應(yīng)用開始以后,函數(shù)main() 被調(diào)用,一些空間分配在”stack” 中。這是為應(yīng)用分配的另一個段的內(nèi)存空間,這是為了函數(shù)變量存儲需要而分配的內(nèi)存。每一次在應(yīng)用中調(diào)用一個函數(shù),“stack ”的一部分會被分配在”stack” 中,稱之為”frame” 。新函數(shù)的本地變量分配在這里。

正如名稱所示,“stack ”是后進(jìn)先出(LIFO )結(jié)構(gòu)。當(dāng)函數(shù)調(diào)用其他的函數(shù)時,“stack frame ”會被創(chuàng)建;當(dāng)其他函數(shù)退出后,這個“frame ”會自動被破壞。

 “heap” 段也稱為”data” 段,提供一個保存中介貫穿函數(shù)的執(zhí)行過程,全局和靜態(tài)變量保存在“heap ”中,直到應(yīng)用退出。

為了訪問你創(chuàng)建在heap 中的數(shù)據(jù),你最少要求有一個保存在stack 中的指針,因?yàn)槟愕腃PU 通過stack 中的指針訪問heap 中的數(shù)據(jù)。

你可以認(rèn)為stack 中的一個指針僅僅是一個整型變量,保存了heap 中特定內(nèi)存地址的數(shù)據(jù)。實(shí)際上,它有一點(diǎn)點(diǎn)復(fù)雜,但這是它的基本結(jié)構(gòu)。

 

簡而言之,操作系統(tǒng)使用stack 段中的指針值訪問heap 段中的對象。如果stack 對象的指針沒有了,則heap 中的對象就不能訪問。這也是內(nèi)存泄露的原因。

在iOS 操作系統(tǒng)的stack 段和heap 段中,你都可以創(chuàng)建數(shù)據(jù)對象。

stack 對象的優(yōu)點(diǎn)主要有兩點(diǎn),一是創(chuàng)建速度快,二是管理簡單,它有嚴(yán)格的生命周期。stack 對象的缺點(diǎn)是它不靈活。創(chuàng)建時長度是多大就一直是多大,創(chuàng)建時是哪個函數(shù)創(chuàng)建的,它的owner 就一直是它。不像heap 對象那樣有多個owner ,其實(shí)多個owner 等同于引用計數(shù)。只有heap 對象才是采用“引用計數(shù)”方法管理它。

stack 對象的創(chuàng)建

只要棧的剩余空間大于stack 對象申請創(chuàng)建的空間,操作系統(tǒng)就會為程序提供這段內(nèi)存空間,否則將報異常提示棧溢出。

heap 對象的創(chuàng)建

操作系統(tǒng)對于內(nèi)存heap 段是采用鏈表進(jìn)行管理的。操作系統(tǒng)有一個記錄空閑內(nèi)存地址的鏈表,當(dāng)收到程序的申請時,會遍歷鏈表,尋找第一個空間大于所申請的heap 節(jié)點(diǎn),然后將該節(jié)點(diǎn)從空閑節(jié)點(diǎn)鏈表中刪除,并將該節(jié)點(diǎn)的空間分配給程序。

例如:

NSString 的對象就是stack 中的對象,NSMutableString 的對象就是heap 中的對象。前者創(chuàng)建時分配的內(nèi)存長度固定且不可修改;后者是分配內(nèi)存長度是可變的,可有多個owner, 適用于計數(shù)管理內(nèi)存管理模式。

兩類對象的創(chuàng)建方法也不同,前者直接創(chuàng)建“NSString * str1=@"welcome"; “,而后者需要先分配再初始化“ NSMutableString * mstr1=[[NSMutableString alloc] initWithString:@"welcome"]; ”。

 

(miki西游 @mikixiyou 原文鏈接: http://mikixiyou.VEvb.com/blog/1595230 )

 

再補(bǔ)充一點(diǎn),這里說的是操作系統(tǒng)的堆和棧。

在我們學(xué)習(xí)“數(shù)據(jù)結(jié)構(gòu)”時,接觸到的堆和棧的概念和這個操作系統(tǒng)中的堆和棧不是一回事的。

操作系統(tǒng)的堆和棧是指對內(nèi)存進(jìn)行操作和管理的一些方式。

“數(shù)據(jù)結(jié)構(gòu)“的堆實(shí)際上指的就是(滿足堆性質(zhì)的)優(yōu)先Queue 的一種數(shù)據(jù)結(jié)構(gòu),第1 個元素有最高的優(yōu)先權(quán);棧實(shí)際上就是滿足先進(jìn)后出的性質(zhì)的數(shù)據(jù)或數(shù)據(jù)結(jié)構(gòu)。


發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 芮城县| 宁国市| 乃东县| 嘉祥县| 休宁县| 奉化市| 台江县| 双鸭山市| 岑巩县| 二手房| 新昌县| 林口县| 白城市| 荣成市| 喀喇沁旗| 湘阴县| 米泉市| 天全县| 奉新县| 台南市| 建阳市| 鲁甸县| 庐江县| 肇庆市| 定安县| 香格里拉县| 涞源县| 昭通市| 赫章县| 新竹县| 新蔡县| 溧阳市| 涿鹿县| 九龙坡区| 静宁县| 胶南市| 台北县| 子洲县| 遵化市| 家居| 茂名市|