網上找到的,有什麼不對的大家指出來,重新學習
1.棧是存放函式返回位址、引數、區域性變數的。
堆是程式可以自由操作的記憶體,使用時先申請,用完之後釋放,如何使用完全由程式**控制。
2.棧在彙編**中表示成push pop,用的是ess段,sp暫存器
而堆不是,是在記憶體中讀寫,eds段,
3.c++包括兩種被應用程式管理的記憶體區域:一種稱為棧(stack),另一種稱為堆(heap)。
stack是函式被呼叫時自動分配的一塊記憶體區域,它主要用於保留函式內使用的變數及函式呼叫位置處下一條**的位址。
stack是後進先出,乙個可變的指標指向stack的頂部。
本質上,當乙個函式被程式呼叫時,當前的執行位址被放入stack,如果有引數傳遞到函式內,這些引數也被壓入stack,如果函式內有變數,它們也被壓入stack,如果函式執行時呼叫另乙個函式,重複上面的過程。
當從函式返回時,stack指標指向存放先前執行位址的位置,也就是說,stack空間內分配的元素已被刪除。這就是為什麼函式內的變數此時無效,因為它們已經被推出了stack,另外要注意的是,宣告乙個靜態變數,它沒有進入stack中。
另一種由應用程式管理的記憶體區域是堆(heap),heap是儲存應用程式的記憶體分配需求,並且分離於程式**和stack,heap中分配的物件的總的空間受限於計算機系統中有效的虛擬記憶體。
c程式通常使用malloc和free分配和**heap記憶體,在c++中,使用new和delete.
4.函式裡的變數一般是stack,用new和malloc分配的是heap
stack是有大小限制的,heap的大小與系統虛擬記憶體差不多
stack運算比heap快
stack由編譯器來管理,heap由程式設計師new, malloc, delete, free
5.heap____自由儲存區
stack____區域性儲存區
通常意義上的堆疊一般指的就是棧
關於堆和棧
1 記憶體分配方面 堆 一般由程式設計師分配釋放,若程式設計師不釋放,程式結束時可能由os 注意它與資料結構中的堆是兩回事,分配方式是類似於鍊錶。可能用到的關鍵字如下 new malloc delete free等等。棧 由編譯器 compiler 自動分配釋放,存放函式的引數值,區域性變數的值等。...
關於 棧 和 堆
棧區 stack 由編譯器自動分配和釋放,申請速度快,但程式設計師無法控制。主要存放函式的引數值 區域性變數等。棧頂位址小於棧的基位址。堆區 heap 由程式設計師分配和釋放,由new和malloc申請,delete和free釋放,分配的記憶體區不一定是連續的,類似鍊錶。若程式設計師不釋放,程式結束...
關於棧和堆
棧區 由程式自動向作業系統申請分配以及 存放函式的引數 區域性變數,當函式呼叫結束時,釋放記憶體。速度快,使用方便。堆區 程式設計師向作業系統申請一塊記憶體,分配速度慢 位址不連續容易碎片化但高度自由。既然是程式設計師申請的,當然是要由程式設計師來銷毀,畢竟做事要有始有終,懂得善後嘛,o o哈哈 注...