很多人對于堆和棧的區(qū)別都感到迷惑,因此我們列出了許多堆和棧的問題和回答空幻,或許對你有幫助默责。
1. 堆和棧存儲在哪里?
堆和棧都存儲在計算機的RAM(Ramdon Access Memory)中陶夜。閱讀 How Virtual Memory Works 了解更多RAM的內(nèi)容。
2. 線程是如何操作堆和棧的 裆站?堆和棧在多線程條件下是如何工作的条辟?
在一個多線程的應用程序中,每一個線程都會有它自己的棧宏胯。但是羽嫡,所有的線程都會共享堆。在一個多線程的應用程序中肩袍,由于不同的線程共享堆杭棵,因此線程之間必須協(xié)作以保證它們不會在同一時間訪問或操作堆中的相同內(nèi)存。
3. 棧和堆中的內(nèi)存都存儲多久呢氛赐?
一旦一個函數(shù)運行完成了魂爪,該函數(shù)的棧中的數(shù)據(jù)將會被自動刪除。而堆中的任何數(shù)據(jù)需要程序手動刪除(或者通過垃圾回收機制回收)艰管,否則將將會一直保留在堆中滓侍。
4. 棧的大小可以增加嗎?堆的大小可以增加嗎蛙婴?
棧被設置成固定的大小粗井,并且大小不能增加(有些語言做了擴展允許增加棧大小)街图。因此浇衬,如果棧上沒有足夠的空間去分配內(nèi)存,會發(fā)生stack overflow錯誤餐济。這種情況常常發(fā)生如果有許多嵌套的函數(shù)被調(diào)用耘擂,或者這兒有個死循環(huán)調(diào)用。
如果分配內(nèi)存的時候堆的空間不夠絮姆,那么操作系統(tǒng)會給堆增加內(nèi)存醉冤。這是堆和棧最大的區(qū)別之一。
5. 堆和棧是怎么實現(xiàn)的篙悯?
堆和棧的實現(xiàn)依賴于語言蚁阳,編譯器和運行時。
6. 堆和棧哪個更快鸽照?為什么螺捐?
棧是更快且開銷更小。這是因為棧上內(nèi)存分配的方式:棧上分配內(nèi)存是非常簡單的,只需要向上移動棧指針定血。
7. 棧和堆上的內(nèi)存是如何回收的赔癌?
當變量超出范圍(?)時,棧上的數(shù)據(jù)是自動回收的澜沟。在C和C++中灾票,堆中存儲的數(shù)據(jù)必須由開發(fā)者利用以下關(guān)鍵字free,delete,或者delete[]手動刪除。其它語言像Java和.NET使用垃圾回收去自動從堆中刪除內(nèi)存茫虽,而不需要開發(fā)者做任何事刊苍。
8. 棧和堆用哪一個?
不同的語言有不同的機制席噩。
原文鏈接: difference-between-stack-and-heap
我做了什么:搬運原文班缰,簡單翻譯贤壁,保留了一些通用的問題和回答悼枢。如有錯誤,歡迎指正脾拆。