1. 程式人生 > 其它 >C++中的堆和棧

C++中的堆和棧

1. 堆和棧有什麼區別

從定義上:堆是由new和malloc開闢的一塊記憶體,由程式設計師手動管理,棧是編譯器自動管理的記憶體,存放函式的引數和區域性變數。

堆空間因為會有頻繁的分配釋放操作,會產生記憶體碎片

堆的生長空間向上,地址越來越大,棧的生長空間向下,地址越來越小

關於c++記憶體空間的構成,大家可以看我這篇文章

C++記憶體管理機制

2. 堆快一點還是棧快一點?

棧快一點。因為作業系統會在底層對棧提供支援,會分配專門的暫存器存放棧的地址,棧的入棧出棧操作也十分簡單,並且有專門的指令執行,所以棧的效率比較高也比較快。而堆的操作是由C/C++函式庫提供的,在分配堆記憶體的時候需要一定的演算法尋找合適大小的記憶體。並且獲取堆的內容需要兩次訪問,第一次訪問指標,第二次根據指標儲存的地址訪問記憶體,因此堆比較慢。

3. new和delete是如何實現的

在new一個物件的時候,首先會呼叫malloc為物件分配記憶體空間,然後呼叫物件的建構函式。delete會呼叫物件的解構函式,然後呼叫free回收記憶體。

new與malloc都會分配空間,但是new還會呼叫物件的建構函式進行初始化,malloc需要給定空間大小,而new只需要物件名