關於堆和棧

2021-10-08 23:14:23 字數 1349 閱讀 6233

1.記憶體布局中的棧和堆

2.資料結構中的棧和堆

資料結構中的棧是一種受限的線性表,只能在一端進行入棧、出棧操作。這端稱為棧頂,另一端稱為棧底。有「先進先出」或「後進先出」規則(filo).棧分順序棧和鏈式棧兩種,是一種線性結構。可用陣列或鍊錶(單鏈表、迴圈鍊錶)作為底層資料結構,使用陣列的為順序棧,使用鍊錶的為鏈式棧。區別是乙個位址連續,乙個位址不連續。基本操作有入棧、出棧、獲取棧頂元素、獲取棧頂元素並刪除等操作。

陣列中的堆是一種完全二叉樹,分為大頂堆和小頂堆。一般用陣列儲存。一般有建立、刪除、插入三種操作。具體應用有堆排序。堆排序是一種穩定的排序,時間複雜度為o(log n)。他的最好情況與最壞情況是一樣的,本來是有序的,還是需要o(log n)進行比較;逆序的話還是需要o(n log n)進行比較插入。 堆排序和快排的效率是差不多的,但是堆排序一般優於快速排序,因為資料的初始分布情況對堆排序的效率沒有大的影響。

2.棧和堆的大小,申請乙個整形陣列最大可以達到多大(在不同版本下)

我們常用的版本分為linux和window系統,棧和堆的大小跟以下幾個因素有關:

當前系統的虛擬位址空間大小,使用者和核心空間劃分比例

實際物理記憶體的大小

當前系統交換分割槽(虛擬記憶體)的大小       

系統預設棧的大小為10m。當我開闢大於10m大小的時候還是會開闢成功,但是還會出現段異常錯誤。堆或者棧在開闢記憶體是都只是在虛擬位址空間上分配記憶體,當進行讀寫操作時,伴隨著缺頁異常,然後才進行頁面對映和分配真正的物理記憶體。缺頁異常處理函式是do_page_fault,越界訪問棧空間,核心會在一定範圍內對棧空間擴容。

堆的大小和當前系統設定的虛擬大小有關。在我們分配記憶體時,並沒有分配真正的物理記憶體,只有在讀取或寫資料時才會出現缺頁異常,才會真正分配物理記憶體和進行頁面對映。在分配記憶體時,會有頁面置換操作。根據lru演算法,把不經常使用的頁面換到交換區中,騰出更多記憶體給程序使用。交換區不宜過多,而且他的讀寫效率低,過多依賴交換分割槽,會導致系統執行效率下降。所以堆的大小與當前系統物理記憶體大小、交換分割槽大小息息相關。因為他們都屬於使用者空間部分。

在window下4g虛擬位址空間的分配比例為2:2(比例可修改),linux系統下為1:3。因此堆在linux下的大小要大於在window是下的大小。

3.4g虛擬位址記憶體空間及變數

linux核心空間給每乙個程序分配了4g大小的虛擬位址空間,3g使用者空間和1g核心空間。

4.內聯函式與巨集的區別

關於堆和棧

1 記憶體分配方面 堆 一般由程式設計師分配釋放,若程式設計師不釋放,程式結束時可能由os 注意它與資料結構中的堆是兩回事,分配方式是類似於鍊錶。可能用到的關鍵字如下 new malloc delete free等等。棧 由編譯器 compiler 自動分配釋放,存放函式的引數值,區域性變數的值等。...

關於堆和棧

網上找到的,有什麼不對的大家指出來,重新學習 1.棧是存放函式返回位址 引數 區域性變數的。堆是程式可以自由操作的記憶體,使用時先申請,用完之後釋放,如何使用完全由程式 控制。2.棧在彙編 中表示成push pop,用的是ess段,sp暫存器 而堆不是,是在記憶體中讀寫,eds段,3.c 包括兩種被...

關於 棧 和 堆

棧區 stack 由編譯器自動分配和釋放,申請速度快,但程式設計師無法控制。主要存放函式的引數值 區域性變數等。棧頂位址小於棧的基位址。堆區 heap 由程式設計師分配和釋放,由new和malloc申請,delete和free釋放,分配的記憶體區不一定是連續的,類似鍊錶。若程式設計師不釋放,程式結束...