c語言中棧和堆的區別(C之堆與棧)
2023-09-27 06:55:52 3
c語言中棧和堆的區別?堆與棧,我來為大家科普一下關於c語言中棧和堆的區別?以下內容希望對你有幫助!

c語言中棧和堆的區別
堆與棧
堆與棧都是內存空間的一部分,堆分為託管堆和非託管堆,託管堆由CLR管理,對非託管堆的管理則由開發者完成。
堆
託管堆是運行程序時,CLR申請的一塊內存空間。
當創建新對象時,如果對象是引用類型或者包括引用類型的值類型,就會在GC堆上申請空閒的內存空間,CLR先計算需要的空間大小,如果堆上沒有剩餘空間了,就觸發一次垃圾回收,如果回收後仍舊沒有足夠的內存空間,就拋出OutOfMemory異常。
為了合理利用空間,GC堆內存分配是連續的,垃圾回收結束,部分空間被釋放,會有內存碎片,此時進行壓縮,將內存重新變為連續狀態。
非託管資源佔用另一部分的內存,叫做本地堆或者非託管堆。CLR不負責這一塊的垃圾回收,常見的非託管資源有文件流、資料庫連接、印表機資源等。
棧
是一個先進後出的棧數據結構,所以一直是連續的。棧中的對象離開了定義域就會自動銷毀,所以棧一般空間是夠用的。爆棧也有例子,比如一個沒有出口的遞歸,此時所有的變量都還在它們的定義域中。
對於引用類型,也會使用棧,但棧只是存儲一個地址,即引用,就是它在堆上的內存地址,通過訪問棧上的地址就可以間接訪問到堆上的引用類型對象以及他們的值。
由於棧只能從頂部放入或者拿走數據,所以內存總是連續的,不需要進行GC。
,