堆記憶體 棧記憶體

2021-07-25 11:54:07 字數 801 閱讀 3633

從堆和棧的功能和作用來通俗的比較,堆主要用來存放物件的,棧主要是用來執行程式的.而這種不同又主要是由於堆和棧的特點決定的:

在程式設計中,例如c/c++中,所有的方法呼叫都是通過棧來進行的,所有的區域性變數,形式引數都是從棧中分配記憶體空間的。實際上也不是什麼分配,只是從棧頂向上用就行,就好像工廠中的傳送帶(conveyor belt)一樣,stack pointer會自動指引你到放東西的位置,你所要做的只是把東西放下來就行.退出函式的時候,修改棧指標就可以把棧中的內容銷毀.這樣的模式速度最快, 當然要用來執行程式了.需要注意的是,在分配的時候,比如為乙個即將要呼叫的程式模組分配資料區時,應事先知道這個資料區的大小,也就說是雖然分配是在程式執行時進行的,但是分配的大小多少是確定的,不變的,而這個"大小多少"是在編譯時確定的,不是在執行時.

堆是應用程式在執行的時候請求作業系統分配給自己記憶體,由於從作業系統管理的記憶體分配,所以在分配和銷毀時都要占用時間,因此用堆的效率非常低.但是堆的優點在於,編譯器不必知道要從堆裡分配多少儲存空間,也不必知道儲存的資料要在堆裡停留多長的時間,因此,用堆儲存資料時會得到更大的靈活性。事實上,物件導向的多型性,堆記憶體分配是必不可少的,因為多態變數所需的儲存空間只有在執行時建立了物件之後才能確定.在c++中,要求建立乙個物件時,只需用 new命令編制相關的**即可。執行這些**時,會在堆裡自動進行資料的儲存.當然,為達到這種靈活性,必然會付出一定的代價:在堆裡分配儲存空間時會花掉更長的時間!這也正是導致我們剛才所說的效率低的原因,

成員變數存在於堆記憶體中,隨著物件的產生而存在,消失而消失。

區域性變數存在於棧記憶體中,隨著所屬區域的執行而存在,結束而釋放。

堆記憶體和棧記憶體

堆 順序隨意 棧 先進後出 堆和棧的區別 一 預備知識 程式的記憶體分配 乙個由c c 編譯的程式占用的記憶體分為以下幾個部分 1 棧區 stack 由編譯器自動分配釋放 存放函式的引數值,區域性變數的值等。其操作方式類似於資料結構中的棧 2 堆區 heap 一般由程式設計師分配釋放,若程式設計師不...

術語 堆 記憶體 ,棧 記憶體

堆表示程式可用的記憶體區,也叫動態記憶體區。堆記憶體的分配與釋放次序是隨機的,這就是說,如果你按次序分配三塊記憶體,那麼到時並不按分配時的次序釋放記憶體。堆管理器會負責所有操作,你只需簡單地使用getmem 函式請求新記憶體或呼叫constructor 建立物件,delphi 會返回乙個新的記憶體塊...

堆記憶體棧記憶體詳解

堆 順序隨意 heap 和資料結構中的堆完全兩回事,記憶體分配的操作方式類似於鍊錶 棧 先進後出 stack 和資料結構中的棧也不是一回事,但是記憶體分配的操作方式類似於資料結構中的棧 入口出口為同乙個 此文討論的是 作業系統中的堆和棧,而不是資料結構中的堆和棧 堆和棧的區別 一 預備知識 程式的記...