程式中的棧 堆和靜態儲存區

2021-06-16 19:24:56 字數 1140 閱讀 2873

一般來說,我們可以簡單的理解為記憶體分為三個部分:靜態區,棧,堆。很多書沒有把把堆和棧解釋清楚,導致初學者總是分不清楚。其實堆疊就是棧,而不是堆。堆的英文是heap ;棧的英文是stack,也翻譯為堆疊。堆和棧都有自己的特性。

程式中的棧

棧是現代電腦程式裡最重要的概念之一

棧在程式中用於維護函式呼叫的上下文,沒有棧就沒有函式,沒有區域性變數

棧儲存了乙個函式呼叫所需的維護資訊:

.函式引數,函式返回位址

.區域性變數

.函式呼叫上下文

沒有棧就沒有函式,所以棧是現代電腦程式裡最重要的概念之一,棧的存在是為了函式的存在而存在的

為什麼不要返回乙個區域性變數的指標?當函式呼叫隻後,棧頂指標esp回退,釋放掉這片空間,區域性變數就被釋放了,會被下乙個函式呼叫所占用到,下乙個函式就很可能把原來記憶體空間的值改變

程式中的堆

為什麼有了棧還需要堆?

.棧上的資料在函式返回後就會被釋放掉,無法傳遞到函式外部,如:不可以傳遞乙個區域性陣列回去

堆是程式中一塊巨大的記憶體空間,可由程式自由使用

堆中被程式申請使用的內存在程式主動釋放前將一直有效

堆由malloc 系列函式或new 操作符分配。其生命週期由free 或delete 決定。在沒有釋放之前一直存在,直到程式結束。其特點是使用靈活,空間比較大,但容易出錯。

系統對堆空間的管理方式

.空閒鍊錶法,點陣圖發,物件池法等等

程式中的靜態儲存區

程式靜態儲存區隨著程式的執行而分配的空間,直到程式執行結束

程式的靜態儲存區主要用於儲存程式中的全域性變數和靜態變數(包括static全域性和區域性變數)

與棧和堆不同,靜態儲存區的資訊最終會儲存到可執行程式中

小結:棧區主要用於函式呼叫的使用

堆區主要用於記憶體的動態申請和歸還

靜態區主要用於儲存全域性變數和靜態變數

棧 堆和靜態區

棧 堆和靜態區 對於程式設計師,一般來說,我們可以簡單的理解為記憶體分為三個部分 靜態區,棧,堆。很多書沒有把把堆和棧解釋清楚,導致初學者總是分不清楚。其實堆疊就是棧,而不是堆。堆的英文是heap 棧的英文是stack,也翻譯為堆疊。堆和棧都有自己的特性,這裡先不做 討論。再打個比方 一層教學樓,可...

靜態儲存區 堆區和棧區

記憶體分配有三種 靜態儲存區 堆區和棧區。他們的功能不同,對他們使用方式也就不同。靜態儲存區 內存在程式編譯的時候就已經分配好,這塊內存在程式的整個執行期間都存在。它主要存放靜態資料 全域性資料和常量。棧區 在執行函式時,函式 包括main函式 內區域性變數的儲存單元都可以在棧上建立,函式執行結束時...

記憶體分配 靜態儲存區 棧 堆

一 記憶體基本構成 可程式設計內存在基本上分為這樣的幾大部分 靜態儲存區 堆區和棧區。他們的功能不同,對他們使用方式也就不同。靜態儲存區 內存在程式編譯的時候就已經分配好,這塊內存在程式的整個執行期間都存在。它主要存放靜態資料 全域性資料和常量。棧區 在執行函式時,函式內區域性變數的儲存單元都可以在...