棧於堆的區別與聯繫(拓展補充)——入門級別

聯繫

  • 0、棧與堆都是操作系統在給正在執行的程序分配的內存的一部分

程序執行過程

  • 1、他們都是操作系統內存管理的組成部分

  • 2、編程中使用的數據都存儲在內存中。從硬件的角度看,被存儲的每個值都佔用一定的物理內存,故它們都是一定存在的物理內存

區別

  • 0、棧(操作系統):由操作系統自動分配釋放 ,存放函數的參數值,局部變量的值等。其操作方式類似於數據結構中的棧。

  • 1、堆(操作系統): 一般由程序員分配釋放, 若程序員不釋放,程序結束時可能由OS(操作系統)回收,分配方式倒是類似於鏈表

  • 2、函數A用堆分配的內存,可在函數B用使用和釋放

物理內存

  • 3、函數A用棧分配的內存,到函數B中無效,不存在

拓展補充:

  • 0、C提供多種管理內存的模型。學會如何選擇不同的類別。大多數情況下,最好選擇自動變量。如果要使用其他變量,應該有充足的理由。通常,使用自動變量、函數形參和返回值進行函數間的通信時比使用全局變量(在函數外部定義,適用於在程序中保持不變的數據)更安全

  • 1、靜態存儲類別所用的內存的數量在編譯的時候就固定了(就是那些static 聲明的變量),在程序運行期間也不會改變,就是說只要程序還在運行,就可訪問儲存在該部分的數據。此類別的變量在程序開始執行時被創建,在程序結束時纔會被銷燬。

  • 2、自動存儲類別的( 自動 )變量(就是正常聲明、定義的變量)在程序進入變量定義所在的塊時存在,在程序離開塊時消失。其使用的內存數量在程序執行期間自動增加或減少。 (因爲多多少少一個程序會有主調函數調用另一個函數,而當主調函數調用時,計算機會爲被調函數中的自動變量主動分配內存(棧中分配)【故內存數量增加】,而當某個被調函數返回到主調函數時,其內部的自動變量就被計算機自動釋放(釋放在棧中的變量)【故內存數據減少】。根據棧的特點,這意味着新創建的變量按順序加入內存,然後以相反的順序銷燬。
    棧運行過程

  • 3、動態分配的內存在調用malloc( )或相關函數時存在,在調用free( )後釋放。這部分的內存由程序員管理。動態分配的內存數量只會增加(堆中分配),除非free()函數進行釋放 ,在free()之前,此動態內存一直存在。實際上,如果沒有成對的使用malloc( )和free( ),內存池內存將會慢慢被耗盡。稱爲內存泄露(memory leak)。故在函數某尾調用free( )函數可避免這類問題發生。另外,使用動態內存通常比使用棧內存慢。

  • 4、理解靜態內存(static聲明)、自動內存(正常的局部變量)和動態分配(malloc()或相關函數的屬性。注意:靜態內存的數量在編譯確定:靜態數據在載入程序時被載入內存。在程序運行時,自動變量被分配或釋放,所以自動變量佔用的內存數量隨着程序的運行會不斷變化。可以把自動內存看作是可重複利用的工作區。動態分配的內存也會增加和減少,但是這個過程由函數調用控制(malloc( )\free( )),不是自動進行的

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章