記憶體的5大區域介紹

2021-09-11 23:51:54 字數 1126 閱讀 5294

1.棧區(stack)是由『編譯器』自動分配並釋放,存放函式的『引數值』, 區域性變數等。棧是『系統』資料結構,對應的 『執行緒/程序』是唯一的。優點是快速高效,缺點是資料不靈活([先進先出])。

棧空間:靜態分配/動態分配。

靜態分配———由編譯器完成的,比如自動變數(auto)的分配。

動態分配———由alloc函式完成。記憶體自動釋放,無需手動釋放,也沒有釋放函式。為可移植的程式起見,棧的動態分配操作是不被鼓勵的。

2.堆區(heap)是讓程式設計師自己分配和釋放的記憶體區域。如果程式設計師不釋放,程式結束時,可能會由『作業系統**』,比如在ios中的alloc 都是存放在堆區中。優點:靈活!! 資料適應面廣泛,缺點:'效率有一定降低'!!

堆區是函式庫內部資料結構,不一定唯一。並且不同堆區分配的記憶體是相互遮蔽的,無法相互操作。還有,堆區的記憶體分配沒有靜態分配之說,都是『動態』的。

雖然程式結束時所有的資料空間都會被釋放回系統,但是: ----------精確地『申請』和釋放記憶體的匹配-------------是乙個程式設計師的基本要求。

3.全域性區---又名靜態區(stack)。顧名思義,它用來存放--全域性變數和靜態變數。

初始化的全域性變數和靜態變數-----------在一塊區域。

未初始化的全域性變數和靜態變數---------在相鄰的另一塊區域。

程式結束後,系統把『這兩塊記憶體區域』釋放掉。

4.文字常量區:---存放常量字串,程式結束後,系統釋放掉它。

5.**區:---存放——函式——的『二進位制』**。

舉例:int a = 10; 全域性區之---全域性初始化區。

char *p;全域性區之---全域性未初始化區。

main {

int b;----------棧區

char s = "hello,world!";----------棧區

char *p1;---------棧區

char *p2 = "hello!"; --------字串hello!在常量區,p2在棧區

stack int c = 0; --------全域性(靜態分配)初始化區

w1 = (char *)malloc(10);

w2 = (char *)malloc(20);

ps:分配得來的10和20位元組的區域在堆區

OC 記憶體管理 記憶體5大區域

棧區域 系統自動分配.儲存區域性變數 如 int num 10,int p num。num 與 p 都儲存在棧區域 堆區域 允許程式設計師手動的從堆申請空間來使用,要主動釋放。除非程式結束 如 int 4,float 4 malloc,calloc bss段區域 儲存未初始化的全域性變數 靜態變數,...

iOS 記憶體的幾大區域

棧區 stack 由編譯器管理 分配釋放 存放函式引數值 區域性變數的值 函式中的基本資料型別 棧區的操作方式類似資料結構中的棧 先進後出 堆區 heap 由程式設計師管理 分配釋放 若程式設計師不釋放,程式結束時可能由系統 os 存放程式設計師new出來的物件。堆的操作方式與資料結構中的堆不同,操...

iOS總結 記憶體的幾大區域

參考 1.棧區 stack 由編譯器自動分配並釋放,存放函式的引數值,區域性變數等.棧是系統資料結構,對應執行緒 進場是唯一的.優點快速高效缺點資料不靈活 先進後出 棧空間分靜態分配和動態分配兩種 靜態分配是編譯器完成的,比如自動變數 auto 的分配 動態分配由alloca函式完成 棧的動態分配無...