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

來源:互聯網
上載者:User

【 聲明:著作權,歡迎轉載,請勿用於商業用途。  聯絡信箱:feixiaoxing @163.com】

    記憶體是程式啟動並執行基礎。所有正在啟動並執行代碼都儲存在記憶體裡面。記憶體需要處理各種各樣的資料,包括鍵盤的資料、滑鼠的資料、usb的資料、串口的資料、網路攝影機的資料,那麼這些資料經過程式的處理之後,就要進行輸出到串口、螢幕、usb等。

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

    (1)全域資料

static int value = 100;void process(){static int number = 10;}

    大家可以在這裡看到,value和number的資料其實都屬於全域資料,這裡的變數是不隨著函數的調用發生變化的。

    (2)堆資料

void process(){char* point = (char*)malloc(100);free(point);}

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

    (3)臨時資料

void process(){char name[100] = {0};return;}

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

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

    1) 全域資料是我們喜歡使用的類型,用起來比較方便

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

    3)堆棧空間只能存在於當時的函數之中,函數返回即失去意義

    

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

    1) 有的時候,我們為了測試的需要,首先構建一個全域記憶體池,以後測試的記憶體都是通過自訂的malloc在記憶體池中分配的,所以這個時候,堆分配和全域聯絡在了一起。

                全域記憶體空間          < =========>  記憶體池     < =========> 本地空間分配

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

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

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

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

    b)記憶體會不會越界

    c)記憶體會不會泄露

    d)記憶體訪問的資料是否依然有效

    

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

   

    

    

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.