天天看點

一步一步寫算法(之記憶體)

【 聲明:版權所有,歡迎轉載,請勿用于商業用途。  聯系信箱:feixiaoxing @163.com】

    記憶體是程式運作的基礎。所有正在運作的代碼都儲存在記憶體裡面。記憶體需要處理各種各樣的資料,包括鍵盤的資料、滑鼠的資料、usb的資料、序列槽的資料、攝像頭的資料,那麼這些資料經過程式的處理之後,就要進行輸出到序列槽、螢幕、usb等。

    記憶體隻有一個,但是程式裡面的空間有很多種。但是記憶體中的資料類型隻有幾種,比如說全局中的資料、堆中的資料、臨時堆棧中的資料。那麼他們有什麼差別呢?我們可以通過代碼發現一些問題。

    (1)全局資料

    大家可以在這裡看到,value和number的資料其實都屬于全局資料,這裡的變量是不随着函數的調用發生變化的。

    (2)堆資料

    這裡的point配置設定的資料就是堆資料,如果沒有free操作,那麼它的存在也是全局的。隻要記憶體不主動釋放,那麼這個記憶體就會以一直存在。

    (3)臨時資料

    這裡的資料都是堆棧内部的資料,一旦process調用結束傳回之前,那麼name位址指向的記憶體空間已經被其他函數使用。此時這段記憶體空間對我們來說已經沒有什麼意義了。是以,不管在函數裡面用了多少空間,如果你想在函數傳回之前繼續使用裡面的資料,務必在函數傳回前拷貝完畢。

    這篇部落格的内容比較簡單,主要講述了記憶體的一些内容。其實關于記憶體的東西還很多。這裡說明一下隻是讓大家有一個了解:

    1) 全局資料是我們喜歡使用的類型,用起來比較友善

    2)堆資料是系統給我們安排的空間

    3)堆棧空間隻能存在于當時的函數之中,函數傳回即失去意義

    雖然我們上面這麼說,但是這三個概念有的時候也是可以互相遷移的,比如說:

    1) 有的時候,我們為了測試的需要,首先建構一個全局記憶體池,以後測試的記憶體都是通過自定義的malloc在記憶體池中配置設定的,是以這個時候,堆配置設定和全局聯系在了一起。

                全局記憶體空間          < =========>  記憶體池     < =========> 本地空間配置設定

    2) 如果我們使用的函數空間比較小,那麼所有的操作就可以在一個函數内部完成了,那麼這時候全局空間和臨時堆棧是不是一緻的呢

               全局空間   < =============>  本地堆棧

    上面的說法有些繞,但是我們的目的隻是想讓大家時刻明白:

    a)必須時刻明白我們的資料在哪塊空間裡面

    b)記憶體會不會越界

    c)記憶體會不會洩露

    d)記憶體通路的資料是否依然有效

【預告: 下面的部落格開始介紹線性空間的内容】

繼續閱讀