【编程】堆(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)的区别的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【编程】位(bit)、字节(byte)和
- 下一篇: python解析原理_python爬虫原