【编程】堆(heap)和栈(stack)的区别
從C/C++的內(nèi)存分配(與操作系統(tǒng)相關(guān))上來說,堆(heap),棧(stack)屬于內(nèi)存空間的一段區(qū)域。
效率:
棧是機(jī)器系統(tǒng)提供的數(shù)據(jù)結(jié)構(gòu),計算機(jī)會在底層對棧提供支持(有專門的寄存器存放棧的地址,壓棧出棧都有專門的機(jī)器指令執(zhí)行),這就決定了棧的效率比較高。
堆則是C/C++函數(shù)庫提供的,它的機(jī)制是很復(fù)雜的。例如分配一塊內(nèi)存,堆會按照一定的算法,在堆內(nèi)存中搜索可用的足夠大小的空間,如果沒有(可能是由于內(nèi)存碎片太多),就有可能調(diào)用系統(tǒng)功能去增加程序數(shù)據(jù)段的內(nèi)存空間,這樣就有機(jī)會分到足夠大小的內(nèi)存,然后進(jìn)行返回。總之,堆的效率比棧要低得多。
管理方式:
棧由編譯器自動管理,無需人為控制,存放函數(shù)的參數(shù)值,局部變量的值等。當(dāng)這個局部變量離開其作用域之后,所占用的內(nèi)存則會被自動釋放,因此在 C 中局部變量也叫自動變量。
堆一般由程序員分配釋放,若程序員不釋放,程序結(jié)束時可能由OS回收 ,容易產(chǎn)生內(nèi)存泄漏(memory leak)。、
空間大小:
棧一般有一定的空間大小(在VC6默認(rèn)的棧空間大小是1M,也有默認(rèn)2M的)。操作系統(tǒng)的棧在內(nèi)存中高地址向低地址增長,也即低地址為棧頂,高地址為棧底。這就導(dǎo)致了棧的空間有限制,如果申請的空間超過棧的剩余空間時,將提示overflow。因此,能從棧獲得的空間較小。
堆在32位系統(tǒng)下,內(nèi)存可以達(dá)到4G的空間(虛擬內(nèi)存的大小,有面試官問過),由此可見,堆獲得的空間比較靈活,也比較大。
碎片問題:
棧不存在這個問題,因?yàn)闂J窍冗M(jìn)后出,不可能有一個內(nèi)存塊從棧中間彈出。在該塊彈出之前,在它上面的(后進(jìn)的棧內(nèi)容)已經(jīng)被彈出。
堆頻繁的 new/delete 會造成內(nèi)存空間的不連續(xù),造成大量的碎片,使程序效率降低(重點(diǎn)是如何解決?如內(nèi)存池、伙伴系統(tǒng)等)。
生長方向:
棧是向低地址擴(kuò)展的數(shù)據(jù)結(jié)構(gòu)(先進(jìn)后出),是連續(xù)的內(nèi)存的區(qū)域。
堆是向高地址擴(kuò)展的數(shù)據(jù)結(jié)構(gòu),是不連續(xù)的內(nèi)存區(qū)域。
猜你喜歡:👇🏻
?【編程】位(bit)、字節(jié)(byte)和字(word)的區(qū)別
?【Excel】一次性快速批量刪除下面多余的空白行
?【Visio】Visio圖片在Word中顯示不全?如何確定Visio作圖大小?
總結(jié)
以上是生活随笔為你收集整理的【编程】堆(heap)和栈(stack)的区别的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【编程】位(bit)、字节(byte)和
- 下一篇: 【编程】char unsigned in