內存管理之棧(stack)和堆(heap)


棧是內存中給一個線程預留的內存空間,有編譯器自動管理分配和釋放。棧遵循LIFO(Last in First out)的順序,通過指針可以方便的釋放空間。

堆是動態分配的空間,一般情況下由一個程序的多個線程共用。比如C++中用new創建的對象存放於堆中。

堆和棧中的存儲內容

棧中存放函數調用的參數和局部變量等。順序是在函數調用時,函數調用語句的下一條可執行語句的地址首先進棧,接着是函數的各個參數,一般是由右往左的順序進行入棧操作,再然后是函數中的局部變量。 當本次函數調用結束后,以與入棧相反的順序進行出棧操作,局部變量先出棧,接着是參數,最后棧頂指針指向最開始存的地址,也就是主函數中的下一條指令,程序以該點位置繼續往后運行。 另外對象也可以存放在棧中。

堆一般是在堆的頭部用一個字節存放堆的大小。堆中的具體內容則有程序員安排。例如通過new聲明的對象存放在堆中。

棧和堆大小的區別?

棧的大小是固定的。當程序申請的內存大小大於棧可分配的內存時,會出現stack overflow. 堆的大小不是固定的,當程序運行時大小可以根據需求變化。

棧和堆的訪問速度和機制?

棧的讀寫速度更快,因為分配內存的機制,只是移動指針,而堆還要做查找等操作。見下圖。

 

棧的讀取機制類似於數據機構棧,而堆類似於數據結構鏈表。

全局變量和靜態變量存放在哪里?

全局變量和靜態變量既不存放在棧上也不存放在堆上 ,而是存放在內存中的靜態區域(static)。

參考鏈接

https://blog.csdn.net/seanchen88/article/details/53388755

https://blog.csdn.net/waidazhengzhao/article/details/76651923


免責聲明!

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



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