在和計算機內存打交道時,我們一定會碰到堆和棧,這兩個東西很容易搞混,那么現在就來梳理一下二者的關系。
棧是用來靜態分配內存的而堆是動態分配內存的,它們都是存在於計算機內存之中。
棧的分配是在程序編譯的時候完成的,直接存儲在內存中,接觸內存很快。棧是后進先出的順序,最后被申請的塊最先被釋放,這樣就很容易跟蹤到棧,釋放棧的過程簡單到僅僅是移動下指針就能完成。
堆的分配是在程序運行時完成的,分配速度較為緩慢,但是堆的可用空間非常的大。堆中的元素相互之間沒有關聯,各自都可以被任何時候隨機訪問。我們可以任何時候申請和釋放一塊內存,這樣會使得我們很難隨時隨地追蹤到堆中某塊位置被分配了還是被釋放了。
當你知道在編譯前需要分配多少數據時且數據量不是很大時可以使用棧。如果不知道在運行時需要多少數據那么就該使用堆。
在多線程的程序里,每個線程都有其自己獨立的棧,它們都共享一個堆。棧是面向線程的而堆是面向進程的。
