tft每日頭條

 > 生活

 > c語言中棧和堆的區别

c語言中棧和堆的區别

生活 更新时间:2024-08-23 05:31:55

c語言中棧和堆的區别?堆與棧,我來為大家科普一下關于c語言中棧和堆的區别?以下内容希望對你有幫助!

c語言中棧和堆的區别(C之堆與棧)1

c語言中棧和堆的區别

堆與棧

堆與棧都是内存空間的一部分,堆分為托管堆和非托管堆,托管堆由CLR管理,對非托管堆的管理則由開發者完成。

托管堆是運行程序時,CLR申請的一塊内存空間。

當創建新對象時,如果對象是引用類型或者包括引用類型的值類型,就會在GC堆上申請空閑的内存空間,CLR先計算需要的空間大小,如果堆上沒有剩餘空間了,就觸發一次垃圾回收,如果回收後仍舊沒有足夠的内存空間,就抛出OutOfMemory異常。

為了合理利用空間,GC堆内存分配是連續的,垃圾回收結束,部分空間被釋放,會有内存碎片,此時進行壓縮,将内存重新變為連續狀态。

非托管資源占用另一部分的内存,叫做本地堆或者非托管堆。CLR不負責這一塊的垃圾回收,常見的非托管資源有文件流、數據庫連接、打印機資源等。

是一個先進後出的棧數據結構,所以一直是連續的。棧中的對象離開了定義域就會自動銷毀,所以棧一般空間是夠用的。爆棧也有例子,比如一個沒有出口的遞歸,此時所有的變量都還在它們的定義域中。

對于引用類型,也會使用棧,但棧隻是存儲一個地址,即引用,就是它在堆上的内存地址,通過訪問棧上的地址就可以間接訪問到堆上的引用類型對象以及他們的值。

由于棧隻能從頂部放入或者拿走數據,所以内存總是連續的,不需要進行GC。

,

更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!

查看全部

相关生活资讯推荐

热门生活资讯推荐

网友关注

Copyright 2023-2024 - www.tftnews.com All Rights Reserved