C++中的堆和棧
阿新 • • 發佈:2021-08-22
1. 堆和棧有什麼區別
從定義上:堆是由new和malloc開闢的一塊記憶體,由程式設計師手動管理,棧是編譯器自動管理的記憶體,存放函式的引數和區域性變數。
堆空間因為會有頻繁的分配釋放操作,會產生記憶體碎片
堆的生長空間向上,地址越來越大,棧的生長空間向下,地址越來越小
關於c++記憶體空間的構成,大家可以看我這篇文章
2. 堆快一點還是棧快一點?
棧快一點。因為作業系統會在底層對棧提供支援,會分配專門的暫存器存放棧的地址,棧的入棧出棧操作也十分簡單,並且有專門的指令執行,所以棧的效率比較高也比較快。而堆的操作是由C/C++函式庫提供的,在分配堆記憶體的時候需要一定的演算法尋找合適大小的記憶體。並且獲取堆的內容需要兩次訪問,第一次訪問指標,第二次根據指標儲存的地址訪問記憶體,因此堆比較慢。
3. new和delete是如何實現的
在new一個物件的時候,首先會呼叫malloc為物件分配記憶體空間,然後呼叫物件的建構函式。delete會呼叫物件的解構函式,然後呼叫free回收記憶體。
new與malloc都會分配空間,但是new還會呼叫物件的建構函式進行初始化,malloc需要給定空間大小,而new只需要物件名