日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【编程】堆(heap)和栈(stack)的区别

發布時間:2025/3/15 编程问答 17 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【编程】堆(heap)和栈(stack)的区别 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.


從C/C++的內存分配(與操作系統相關)上來說,堆(heap),棧(stack)屬于內存空間的一段區域。

效率:

棧是機器系統提供的數據結構,計算機會在底層對棧提供支持(有專門的寄存器存放棧的地址,壓棧出棧都有專門的機器指令執行),這就決定了棧的效率比較高。

堆則是C/C++函數庫提供的,它的機制是很復雜的。例如分配一塊內存,堆會按照一定的算法,在堆內存中搜索可用的足夠大小的空間,如果沒有(可能是由于內存碎片太多),就有可能調用系統功能去增加程序數據段的內存空間,這樣就有機會分到足夠大小的內存,然后進行返回。總之,堆的效率比棧要低得多。

管理方式:

棧由編譯器自動管理,無需人為控制,存放函數的參數值,局部變量的值等。當這個局部變量離開其作用域之后,所占用的內存則會被自動釋放,因此在 C 中局部變量也叫自動變量。

堆一般由程序員分配釋放,若程序員不釋放,程序結束時可能由OS回收 ,容易產生內存泄漏(memory leak)。、

空間大小:

棧一般有一定的空間大小(在VC6默認的棧空間大小是1M,也有默認2M的)。操作系統的棧在內存中高地址向低地址增長,也即低地址為棧頂,高地址為棧底。這就導致了棧的空間有限制,如果申請的空間超過棧的剩余空間時,將提示overflow。因此,能從棧獲得的空間較小。

堆在32位系統下,內存可以達到4G的空間(虛擬內存的大小,有面試官問過),由此可見,堆獲得的空間比較靈活,也比較大。

碎片問題:

棧不存在這個問題,因為棧是先進后出,不可能有一個內存塊從棧中間彈出。在該塊彈出之前,在它上面的(后進的棧內容)已經被彈出。

堆頻繁的 new/delete 會造成內存空間的不連續,造成大量的碎片,使程序效率降低(重點是如何解決?如內存池、伙伴系統等)。

生長方向:

棧是向低地址擴展的數據結構(先進后出),是連續的內存的區域。

堆是向高地址擴展的數據結構,是不連續的內存區域。

猜你喜歡:👇🏻
?【編程】位(bit)、字節(byte)和字(word)的區別
?【Excel】一次性快速批量刪除下面多余的空白行
?【Visio】Visio圖片在Word中顯示不全?如何確定Visio作圖大小?

總結

以上是生活随笔為你收集整理的【编程】堆(heap)和栈(stack)的区别的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。