一般來說,我們可以簡單的理解為記憶體分為三個部分:靜態區,棧,堆。很多書沒有把把堆和棧解釋清楚,導致初學者總是分不清楚。其實堆疊就是棧,而不是堆。堆的英文是heap ;棧的英文是stack,也翻譯為堆疊。堆和棧都有自己的特性。
程式中的棧
棧是現代電腦程式裡最重要的概念之一
棧在程式中用於維護函式呼叫的上下文,沒有棧就沒有函式,沒有區域性變數
棧儲存了乙個函式呼叫所需的維護資訊:
.函式引數,函式返回位址
.區域性變數
.函式呼叫上下文
沒有棧就沒有函式,所以棧是現代電腦程式裡最重要的概念之一,棧的存在是為了函式的存在而存在的
為什麼不要返回乙個區域性變數的指標?當函式呼叫隻後,棧頂指標esp回退,釋放掉這片空間,區域性變數就被釋放了,會被下乙個函式呼叫所占用到,下乙個函式就很可能把原來記憶體空間的值改變
程式中的堆
為什麼有了棧還需要堆?
.棧上的資料在函式返回後就會被釋放掉,無法傳遞到函式外部,如:不可以傳遞乙個區域性陣列回去
堆是程式中一塊巨大的記憶體空間,可由程式自由使用
堆中被程式申請使用的內存在程式主動釋放前將一直有效
堆由malloc 系列函式或new 操作符分配。其生命週期由free 或delete 決定。在沒有釋放之前一直存在,直到程式結束。其特點是使用靈活,空間比較大,但容易出錯。
系統對堆空間的管理方式
.空閒鍊錶法,點陣圖發,物件池法等等
程式中的靜態儲存區
程式靜態儲存區隨著程式的執行而分配的空間,直到程式執行結束
程式的靜態儲存區主要用於儲存程式中的全域性變數和靜態變數(包括static全域性和區域性變數)
與棧和堆不同,靜態儲存區的資訊最終會儲存到可執行程式中
小結:棧區主要用於函式呼叫的使用
堆區主要用於記憶體的動態申請和歸還
靜態區主要用於儲存全域性變數和靜態變數
棧 堆和靜態區
棧 堆和靜態區 對於程式設計師,一般來說,我們可以簡單的理解為記憶體分為三個部分 靜態區,棧,堆。很多書沒有把把堆和棧解釋清楚,導致初學者總是分不清楚。其實堆疊就是棧,而不是堆。堆的英文是heap 棧的英文是stack,也翻譯為堆疊。堆和棧都有自己的特性,這裡先不做 討論。再打個比方 一層教學樓,可...
靜態儲存區 堆區和棧區
記憶體分配有三種 靜態儲存區 堆區和棧區。他們的功能不同,對他們使用方式也就不同。靜態儲存區 內存在程式編譯的時候就已經分配好,這塊內存在程式的整個執行期間都存在。它主要存放靜態資料 全域性資料和常量。棧區 在執行函式時,函式 包括main函式 內區域性變數的儲存單元都可以在棧上建立,函式執行結束時...
記憶體分配 靜態儲存區 棧 堆
一 記憶體基本構成 可程式設計內存在基本上分為這樣的幾大部分 靜態儲存區 堆區和棧區。他們的功能不同,對他們使用方式也就不同。靜態儲存區 內存在程式編譯的時候就已經分配好,這塊內存在程式的整個執行期間都存在。它主要存放靜態資料 全域性資料和常量。棧區 在執行函式時,函式內區域性變數的儲存單元都可以在...