轉自https://github.com/Damonvvong/DevNotes/blob/master/Notes/framework2.md
關于內存五大分區
-
BSS段:
- BSS段( bss segment )通常是指用來存放程序中
未初始化的全局變量和靜態變量
的一塊內存區域。 - 這里注意一個問題:一般的書上都會說全局變量和靜態變量是會自動初始化的,那么哪來的未初始化的變量呢?變量的初始化可以分為顯示初始化和隱式初始化,全局變量和靜態變量如果程序員自己不初始化的話的確也會被初始化,那就是不管什么類型都初始化為0,這種沒有顯示初始化的就 是我們這里所說的未初始化。
既然都是0那么就沒必要把每個0都存儲起來,從而節省磁盤空間,這是BSS的主要作用
- BSS是英文Block Started by Symbol的簡稱。BSS段屬于靜態內存分配。 BSS節不包含任何數據,只是簡單的維護開始和結束的地址,即總大小。以便內存區能在運行時分配并被有效地清零。BSS節在應用程序的二進制映象文件中并不存在,即不占用 磁盤空間 而只在運行的時候占用內存空間 ,
所以如果全局變量和靜態變量未初始化那么其可執行文件要小很多
。
- BSS段( bss segment )通常是指用來存放程序中
-
數據段(data segment)**
- 通常是指用來存放程序中已經
初始化的全局變量和靜態變量
的一塊內存區域。數據段屬于靜態內存分配,可以分為只讀數據段
和讀寫數據段
。字符串常量等,但一般都是放在只讀數據段中。
- 通常是指用來存放程序中已經
-
代碼段(code segment/text segment)**
- 通常是指用來存放
程序執行代碼的一塊內存區域
。這部分區域的大小在程序運行前就已經確定,并且內存區域通常屬于只讀, 某些架構也允許代碼段為可寫,即允許修改程序。在代碼段中,也有可能包含一些只讀的常數變量,例如字符串常量等,但一般都是放在只讀數據段中 。
- 通常是指用來存放
-
堆(heap)**
- 堆是用于存放進程運行中被
動態分配的內存段
,它的大小并不固定,可動態擴張或 縮減。當進程調用malloc等函數分配內存時,新分配的內存就被動態添加到堆上(堆被擴張); 當利用free等函數釋放內存時,被釋放的內存從堆中被剔除(堆被縮減)
- 堆是用于存放進程運行中被
-
棧 (stack heap)**
- 棧又稱堆棧, 是
用戶存放程序臨時創建的局部變量
,也就是說我們函數括弧“{}” 中定義的變量(但不包括static聲明的變量,static意味著在數據段
中存放變量)。除此以外, 在函數被調用時,其參數也會被壓入發起調用的進程棧中,并且待到調用結束后,函數的返回值 也會被存放回棧中。由于棧的后進先出特點,所以 棧特別方便用來保存/恢復調用現場。從這個意義上講,我們可以把堆棧看成一個寄存、交換臨時數據的內存區。
- 棧又稱堆棧, 是
framework2-memory.png
小 Tips
- 棧區中的變量不需要程序員管理
- 堆區的需要程序員管理
- 在 iOS 中堆區的內存是所有應用程序共享
- 系統使用表級別結構來分配內存空間,所以邏輯地址和物理地址可能不一樣