棧是內存中給一個線程預留的內存空間,有編譯器自動管理分配和釋放。棧遵循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
