在c語言中,記憶體分配的空間一般分為六個區。常量**區、資料段區、bss段、堆空間、棧空間以及記憶體空間。記憶體空間是從下向上增長的。
(1)、常量區:用來存放**和常量
(2)、資料段:用來存放初始化的靜態變數和全域性變數
(3)、bss段:用來存放未初始化的靜態變數和全域性變數
(4)、堆空間:動態malloc申請的空間,引用的變數例項化儲存的空間
(5)、棧空間:用來存放區域性變數,形參之類,未進行例項化的引用申請的變數
(6)、核心空間:用來存放核心**和環境變數
而c語言中尤其是堆區和棧區的比較繁雜,經常容易混淆,筆者就是屬於這種經常被繞的頭暈的存在。
從上面可以看出堆區和棧區在記憶體分配管理中是靠著的,但是兩者之間存在有快取區進行隔開,其實堆區和棧區區別還是比較大的,主要在一下六個方面存在著差異:
(1)、管理方式不同:棧直接由編譯器管理(產生和消除),堆由程式設計師管理,程式設計師管理其的產生和消除
(2)、空間大小不同:棧占用的空間較小,而堆占用的空間較大
(3)、能否產生碎片不同:棧不會產生碎片,但是堆會產生,會有記憶體洩露的問題
(4)、生長方向不同:棧是向下壓棧,堆是向上存放資料
(5)、分配方式不同:棧是在程式設計師申請之後,由系統分配的沒有經過初始化的變數,只有動態分配方式。而堆是由程式設計師自己例項化,建立的已經過初始化的變數,分配方式類似於鍊錶,動態分配和靜態分配都可以
(6)、分配效率不同:棧是由記憶體分配的,系統專門為其準備暫存器,同時有專門的出棧和入棧指令,因而效率比較高。而堆空間則是c庫分配的,可能會存在碎片的原因導致記憶體不連續,因而效率比較低
ios程式中的記憶體分配 棧區堆區全域性區
在計算機系統中,執行的應用程式的資料都是儲存在記憶體中的,不同型別的資料,儲存的記憶體區域不同。1 棧區 stack 由編譯器自動分配並釋放,存放函式的引數值,區域性變數等。棧是系統資料結構,對應執行緒 程序是唯一的。優點是快速高效,缺點時有限制,資料不靈活。先進後出 棧空間分靜態分配 和動態分配兩...
iOS程式中的記憶體分配 棧區堆區全域性區
在計算機系統中,執行的應用程式的資料都是儲存在記憶體中的,不同型別的資料,儲存的記憶體區域不同。一 記憶體分割槽 1 棧區 stack 由編譯器自動分配並釋放,存放函式的引數值,區域性變數等。棧是系統資料結構,對應執行緒 程序是唯一的。優點是快速高效,缺點是有限制,資料不靈活 先進先出 棧空間分靜態...
棧區和堆區記憶體分配
以下是對棧區和堆區記憶體分配的區別進行了詳細的分析介紹,需要的朋友可以過來參考下 一直以來總是對這個問題的認識比較朦朧,我相信很多朋友也是這樣的,總是聽到記憶體一會在棧上分配,一會又在堆上分配,那麼它們之間到底是怎麼的區別呢?為了說明這個問題,我們先來看一下記憶體內部的組織情況 從上圖可知,程式占用...