計算機記憶體中的堆與棧

2021-07-12 05:21:55 字數 1054 閱讀 3157

乙個由c/c++編譯的程式占用的記憶體分為以下幾個部分

1、棧區(stack)— 由編譯器自動分配釋放 ,存放函式的引數值,區域性變數的值等。其操作方式類似於資料結構中的棧

2、堆區(heap) — 一般由程式設計師分配釋放, 若程式設計師不釋放,程式結束時可能由os** 。注意它與資料結構中的堆是兩回事,分配方式倒是類似於鍊錶.

3、全域性區(靜態區)(static)—全域性變數和靜態變數的儲存是放在一塊的,初始化的全域性變數和靜態變數在一塊區域, 未初始化的全域性變數和未初始化的靜態變數在相鄰的另一塊區域。 - 程式結束後有系統釋放

4、文字常量區 —常量字串就是放在這裡的。 程式結束後由系統釋放 

5、程式**區—存放函式體的二進位制**。

例如:

int a = 0; 全域性初始化區

char *p1; 全域性未初始化區

main()

一般大家說的堆疊和棧是一樣的,就是棧(stack),而說堆時才是堆heap。

棧是先入後出的,一般是由高位址向低位址生長。

還有就是函式呼叫時會在棧上有一系列的保留現場及傳遞引數的操作。棧的空間大小有限定,vc的預設是2m。棧不夠用的情況一般是程式中分配了大量陣列和遞迴函式層次太深。有一點必須知道,當乙個函式呼叫完返回後它會釋放該函式中所有的棧空間。棧是由編譯器自動管理的,不用你操心。堆是動態分配記憶體的,並且你可以分配使用很大的記憶體。但是用不好會產生記憶體洩漏。並且頻繁地malloc和free會產生記憶體碎片(有點類似磁碟碎片),因為c分配動態記憶體時是尋找匹配的記憶體的。而用棧則不會產生碎片。在棧上訪問資料比通過指標在堆上訪問資料快些。

全域性區的變數儲存時由低到高,與棧相反。

全域性變數和靜態變數的儲存是放在一塊的,初始化的全域性變數和靜態變數在一塊區域, 未初始化的全域性變數和未初始化的靜態變數在相鄰的另一塊區域

計算機記憶體

1.1 計算機硬體記憶體架構。計算機cpu central processing unit 和記憶體的互動是最頻繁的,記憶體是我們的快取記憶體區。使用者磁碟和cpu的互動,而cpu運轉速度越來越快,磁碟遠遠跟不上cpu的讀寫速度,才設計了記憶體,使用者快取使用者io等待導致cpu的等待成本。但是隨著...

計算機記憶體中的分割槽

c語言中乙個簡單的指標練習題 include void main void copy string char from,char to to 0 功能是將字串a拷貝到字串b中去。編譯鏈結都ok,執行報錯。提示非法訪問。下面直接貼內容 在c 中,記憶體分成5個區,他們分別是堆 棧 自由儲存區 全域性 ...

計算機記憶體中的對齊

現代計算機中記憶體空間都是按照byte劃分的,從理論上講似乎對任何型別的變數的訪問可以從任何位址開始,但實際情況是在訪問特定變數的時候經常在特定的記憶體位址訪問,這就需要各型別資料按照一定的規則在空間上排列,而不是順序的乙個接乙個的排放,這就是對齊。對齊的作用和原因 各個硬體平台對儲存空間的處理上有...