堆和棧的區別


現在的計算機面試題中大多都會問到堆和棧的區別,下面仔細講講兩者的六大區別:
1.管理方式不同
堆是由程序員通過 調用系統庫函數來管理內存,所以管理不力 就會出現常說的內存泄漏
棧是由計算機系統分配內存 而且系統有專門的寄存器存儲棧指針。
2.生長方式不同
堆是向高地址擴展 也就是常說的向上生長。是不連續的內存區域。
棧是向低地址擴展 也就是常說的向下生長。 是連續的內存區域。
(我 本人是這么理解的。因為堆是人為分配地址 所以分配的地址大小往往比實際需要的內存大,所以是不連續的內存區域。而對於棧而言 ,系統有分配專門的寄存器存放棧地址,壓棧出棧由專門的指令(先進后出FILO)執行,所以是連續的內存區域。如果理解不對,還望指出。)
3.空間大小不同
堆的大小 可以高達 4G 在32位Linux里系統有效的虛擬內存也有3.2G
棧的大小 一般是 1M ~10M 不等(和堆相差很多)。
4.內存速率不同
棧的內存速率較快。前面說了 棧是系統分配內存 ,而且有這FILO的出棧順序 所以棧的內存速率快些。
堆 因為是程序員分配內存 ,而且是由C/C++函數庫提供的。而且機制比較復雜,為了找打到一塊合適大小的內存區域 會挨個遍歷。所以耗時也就比較多些。
5.存儲內容不同
棧在函數調用時,首先壓入主調函數中下條指令(函數調用語句的下條可執行語句)的地址,然后是函數實參,然后是被調函數的局部變量。本次調用結束后,局部變量先出棧,然后是參數,最后棧頂指針指向最開始存的指令地址,程序由該點繼續運行下條可執行語句。
堆通常在頭部用一個字節存放其大小,堆用於存儲生存期與函數調用無關的數據,具體內容由程序員安排。
(其實我自己的理解是棧有自己的出棧方式FILO 所以局部調用結束后就直接出棧了,然后進行其他沒出棧的操作處理。而堆是先存需要的內存大小,然后后面的就交給創建者自己處理了)
6.分配方式不同
棧可靜態分配或動態分配。靜態分配由編譯器完成,如局部變量的分配。動態分配由alloca函數在棧上申請空間,用完后自動釋放。
堆只能動態分配且手工釋放。(堆就好比OC語言里的MRC,而OC里的ARC就是蘋果幫我們處理的MRC)
本文中的()部分只作為幫助理解, 不作為正確的區別答案。如果想要深入了解堆棧。推薦看下《計算機原理》和《數據結構》這兩本教材


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM