1. 程式人生 > >程序的虛擬地址空間分配概述

程序的虛擬地址空間分配概述

一、為什麼進行記憶體空間的分配

在任何程式設計環境及語言中,記憶體管理都十分重要。在目前的計算機系統或嵌入式系統中,記憶體資源仍然是有限的。因此在程式設計中,有效地管理記憶體資源是程式設計師首先考慮的問題。

二、程序虛擬地址空間的分類和空間示意圖

  • 棧區—由編譯器自動分配釋放,存放函式形參,區域性變數和自動變數
  • 堆區—用於分配由malloc、realloc、calloc分配的空間
  • 資料區—該區又分為bss段rodata段data段:
  •  bss段—儲存未初始化或者初始化為0全域性變數
  • rodata段—用於儲存常量
  • data段(靜態資料區)—儲存初始化不為0的全域性變數或者static修飾的變數
  • 程式碼區—存放函式體的二進位制程式碼
 示意圖
三、各地址空間的特點
  • 棧區—棧區的許可權由系統決定,資料具有先進後出,後進先出的特點。若定義一個未初始化的區域性變數,該變數被初始化為隨機值
  • 堆區—堆區的許可權由使用者決定,使用者通過malloc、ralloc、calloc分配地址空間,並使用free()函式釋放空間,資料具有先進先        出、後進後出的特點
  • 資料區: 
  • bss段—若定義了一個未初始化的全域性變數,該變數被預設初始化為0 
  • rodata段—當中儲存的常量是不允許被修改的
  • data段(靜態資料區) — 若定義了一個未初始化的靜態全域性變數,該全域性變數被預設初始化為0
  • 程式碼區—存放了程式程式碼的資料,假如機器中有數個程序執行相同的一個程式,那麼它們就可以使用同一個程式碼段