iOS程序中的內(nèi)存分配 棧區(qū)堆區(qū)全局區(qū)

轉(zhuǎn)自: iOS程序中的內(nèi)存分配 棧區(qū)堆區(qū)全局區(qū)
在計算機系統(tǒng)中,運行的應用程序的數(shù)據(jù)都是保存在內(nèi)存中的,不同類型的數(shù)據(jù),保存的內(nèi)存區(qū)域不同。

一、內(nèi)存分區(qū)

1 棧區(qū)(stack)

由編譯器自動分配并釋放,存放函數(shù)的參數(shù)值,局部變量等。棧是系統(tǒng)數(shù)據(jù)結(jié)構(gòu),對應線程/進程是唯一的。
優(yōu)點是快速高效,缺點時有限制,數(shù)據(jù)不靈活。[先進后出]

??臻g分靜態(tài)分配 和動態(tài)分配兩種。

  • 靜態(tài)分配是編譯器完成的,比如自動變量(auto)的分配。
  • 動態(tài)分配由alloc函數(shù)完成。
    棧的動態(tài)分配無需釋放(是自動的),也就沒有釋放函數(shù)。 為可移植的程序起見,棧的動態(tài)分配操作是不被鼓勵的!

2 堆區(qū)(heap)

由程序員分配和釋放,如果程序員不釋放,程序結(jié)束時,可能會由操作系統(tǒng)回收 ,比如在ios 中 alloc 都是存放在堆中。
優(yōu)點是靈活方便,數(shù)據(jù)適應面廣泛,但是效率有一定降低。[順序隨意]

 堆是函數(shù)庫內(nèi)部數(shù)據(jù)結(jié)構(gòu),不一定唯一。
 不同堆分配的內(nèi)存無法互相操作。
 堆空間的分配總是動態(tài)的
雖然程序結(jié)束時所有的數(shù)據(jù)空間都會被釋放回系統(tǒng),但是精確的申請內(nèi)存,釋放內(nèi)存匹配是良好程序的基本要素。

3 全局區(qū)(靜態(tài)區(qū)) (static)

全局變量和靜態(tài)變量的存儲是放在一起的,初始化的全局變量和靜態(tài)變量存放在一塊區(qū)域,未初始化的全局變量和靜態(tài)變量在相鄰的另一塊區(qū)域,程序結(jié)束后有系統(tǒng)釋放。

注意:全局區(qū)又可分為未初始化全局區(qū):
     .bss段和初始化全局區(qū):data段。
     舉例:int a;未初始化的。int a = 10;已初始化的。
例子代碼:

  int a = 10;  全局初始化區(qū)
  char *p;  全局未初始化區(qū)

 main{
   int b; 棧區(qū)
   char s[] = "abc" 棧
   char *p1; 棧 
   char *p2 = "123456";  123456\\\\0在常量區(qū),p2在棧上。
   static int c =0; 全局(靜態(tài))初始化區(qū) 

   w1 = (char *)malloc(10); 
   w2 = (char *)malloc(20); 
   分配得來得10和20字節(jié)的區(qū)域就在堆區(qū)。 
 }

4 文字常量區(qū)

存放常量字符串,程序結(jié)束后由系統(tǒng)釋放

5程序代碼區(qū)

存放函數(shù)的二進制代碼

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

相關閱讀更多精彩內(nèi)容

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