c 面試題 堆和棧的區別

2021-10-05 05:30:00 字數 1039 閱讀 6446

二、說一說棧和堆的區別

1、記憶體分配方式不同

1)棧記憶體:

儲存區域性變數、臨時變數、函式引數等,由編譯器自動分配和**記憶體,

2)堆記憶體:

由程式設計師手動分配和**記憶體,使用new運算子手動申請記憶體,必須使用delete手動釋放記憶體

2、申請大小限制

棧:在windows下,棧是向低位址擴充套件的資料結構,是一塊連續的記憶體區域。棧通常是有大小限制的,在windows下,棧的大小是2m(也有的說是1m,總之是乙個編譯時就確定的常數),如果申請的空間超過棧的剩餘空間時,將提示overflow。因此,能從棧獲得的空間較小。

堆:堆是向高位址擴充套件的資料結構,是不連續的記憶體區域。這是由於系統是用鍊錶來儲存的空閒記憶體位址的,自然是不連續的,而鍊錶的遍歷方向是由低位址向高位址。堆的大小受限於作業系統中有效的虛擬記憶體。由此可見,堆獲得的空間比較靈活,也比較大。

3.申請後系統的響應

棧:只要棧的剩餘空間大於所申請的空間,系統將為程式提供記憶體,否則將報異常提示棧溢位。

堆:在記錄空閒記憶體位址的鍊錶中尋找乙個空間大於所申請空間的堆結點,然後將該結點從空閒結點鍊錶中刪除,並將該結點的空間分配給程式。另外,對於大多數系統會在這塊記憶體空間的首位址出記錄本次分配空間的大小,這樣**中的delete才能正確釋放本記憶體空間。系統會將多餘的那部分重新空閒鍊錶中。

4、分配效率不同

棧的效率比較高,棧是機器系統提供的資料結構,計算機會在底層對棧提供支援:分配專門的暫存器存放棧的位址,壓棧出棧都有專門的指令執行,這就決定了棧的效率比 較高。

堆則是c/c++函式庫提供的,它的機制是很複雜的,例如為了分配一塊記憶體,庫函式會按照一定的演算法(具體的演算法可以參考資料結構/作業系統)在堆 記憶體中搜尋可用的足夠大小的空間,如果沒有足夠大小的空間(可能是由於記憶體碎片太多),就有可能呼叫系統功能去增加程式資料段的記憶體空間,這樣就有機會分 到足夠大小的記憶體,然後進行返回。顯然,堆的效率比棧要低得多。

參考棧記憶體和堆記憶體的區別(乙個筆試題的一部分)

c++記憶體管理學習堆和棧

面試題思考 堆區和棧區的區別(記憶體)

2.申請後系統的響應不同 3.申請大小的限制不同 4.申請效率的比較 5.堆和棧中的儲存內容 6.堆和棧的區別可以用如下的比喻來看出 例子 string str new string hello 變數str放在棧上,用new建立出來的字串物件放在堆上,而 hello 這個字面量是放在方法區的 建立了...

C 堆和棧的區別(C 面試)

堆和棧的區別要從兩方面來講 一 資料結構 1.棧記憶體是由系統分配,系統釋放,以函式為單位進行棧記憶體分配,函式棧幀 區域性變數 形參變數都儲存在棧記憶體上 堆記憶體是由使用者自己分配的,c語言用malloc free進行申請 釋放記憶體,c 用new delete進行申請 釋放記憶體,由於堆需要使...

面試題之一 堆疊區別

堆疊面試題 一 堆疊簡介 棧是編譯器自動申請與分配,程式設計師無法進行控制的順序線性結構,在程式結束時,由系統進行 堆是一種需要程式設計師手動申請的鍊錶結構,申請的記憶體空間需要程式設計師手動釋放,程式設計師不釋放時系統可能 二 堆疊差別棧 堆結構上 順序線性結構 鍊錶操作上 由編譯器自動申請分配釋...