iOS內(nèi)存五大分區(qū)

一、棧區(qū)

又稱 堆棧 ,由編譯器自動分配釋放,是用戶存放程序臨時創(chuàng)建的局部變量,也就是說我們函數(shù)括弧“{}” 中定義的變量(但不包括 static 聲明的變量, static 意味著在數(shù)據(jù)段中存放變量)。除此以外, 在函數(shù)被調(diào)用時,其參數(shù)也會被壓入發(fā)起調(diào)用的進程棧中,并且待到調(diào)用結(jié)束后,函數(shù)的返回值 也會被存放回棧中。由于 的后進先出特點,所以 特別方便用來保存/恢復調(diào)用現(xiàn)場。從這個意義上講,我們可以把 堆棧 看成一個寄存、交換臨時數(shù)據(jù)的內(nèi)存區(qū)。

是向低地址擴展的數(shù)據(jù)結(jié)構(gòu),是一塊連續(xù)的內(nèi)存區(qū)域

二、堆區(qū)

由程序員分配釋放,分配方式類似于鏈表,是向高地址擴展的數(shù)據(jù)結(jié)構(gòu),是不連續(xù)的內(nèi)存區(qū)域。用于存放進程運行中被動態(tài)分配的內(nèi)存段,堆區(qū)的大小并不固定,可動態(tài)擴張或縮減。當進程調(diào)用 alloc 等函數(shù)分配內(nèi)存時,新分配的內(nèi)存就被動態(tài)添加到堆上(堆被擴張);當利用 realse 釋放內(nèi)存時,被釋放的內(nèi)存從堆中被剔除(堆被縮減)。如果應用程序沒有釋放掉,操作系統(tǒng)會自動回收。變量通過 new、alloc、malloc、realloc 分配的內(nèi)存塊就存放在堆區(qū)。

三、全局/靜態(tài)區(qū)

全局/靜態(tài)區(qū) 是存放全局變量和靜態(tài)變量的。

已初始化的全局變量和靜態(tài)變量存放在一塊區(qū)域。

未初始化的全局變量和靜態(tài)變量在相鄰的另一塊區(qū)域。

static 修飾的變量會成為靜態(tài)變量,該變量的內(nèi)存由全局/靜態(tài)區(qū)在編譯階段完成分配,且僅分配一次。

static 可以修飾局部變量也可以修飾全局變量。

全局/靜態(tài)區(qū) 的內(nèi)存在編譯階段完成分配,程序運行時會一直存在內(nèi)存中,只有當程序結(jié)束后才會由操作系統(tǒng)釋放。

四、常量區(qū)

常量區(qū) 是一塊比較特殊的存儲區(qū),常量區(qū)里面存放的是常量,常量字符串就存放在常量區(qū)。

常量區(qū) 的內(nèi)存在編譯階段完成分配,程序運行時會一直存在內(nèi)存中,只有當程序結(jié)束后才會由操作系統(tǒng)釋放。

五、代碼區(qū)

代碼區(qū) 是用來存放可執(zhí)行文件的操作指令(存放函數(shù)的二進制代碼),其實就是存放程序的所有代碼。代碼區(qū) 需要防止在運行時被非法修改,所以只準許讀取操作,而不允許寫入(修改)操作——它是不可寫的。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內(nèi)容