靜態分配記憶體和動態分配記憶體

2021-06-25 09:24:28 字數 1847 閱讀 3496

首先,在使用動態分配記憶體技術前,必須明白自己在做什麼,這樣做與其它的方法有什麼不同,特別是會產生哪些負面影響,天下沒有免費的午餐。動態分配記憶體與靜態分配記憶體的區別:

1) 靜態記憶體分配是在編譯時完成的,不需要占用cpu資源;動態分配記憶體是在執行時完成的,動態記憶體的分配與釋放需要占用cpu資源;

2) 靜態記憶體分配是在棧上分配的,動態記憶體是堆上分配的;

3) 動態記憶體分配需要指標或引用資料型別的支援,而靜態記憶體分配不需要;

4) 靜態分配記憶體需要在編譯前確定記憶體塊的大小,而動態分配記憶體不需要編譯前確定記憶體大小,根據執行時環境確定需要的記憶體塊大小,按照需要分配記憶體即可。可以這麼說,靜態記憶體分配是按計畫分配,而動態記憶體分配是按需分配。

5) 靜態分配記憶體是把記憶體的控制權交給了編譯器,而動態記憶體是把記憶體的控制權交給了程式設計師;

綜上所述,靜態分配記憶體適合於編譯時就已經可以確定需要占用記憶體多少的情況,而在編譯時不能確定記憶體需求量時可使用動態分配記憶體;但靜態分配記憶體的執行效率要比動態分配記憶體的效率要高,因為動態記憶體分配與釋放需要額外的開銷;動態記憶體管理水平嚴重依賴於程式設計師的水平,如果處理不當容易造成記憶體洩漏。那麼再具體些,如何選擇記憶體分配方式,如果動態分配記憶體需要注意哪些問題呢?

需要強調的是,由於動態分配記憶體把記憶體的控制權交給了程式設計師,程式設計師有義務寫**確認記憶體分配成功能,如果分配失敗要做適當處理,否則將給你的程式進而下乙個定時炸彈,隨時有可能因為動態記憶體分配失敗而導致程式崩潰。

1. 全域性變數盡可能不要動態分配記憶體。

既然將變數定義為全域性變數,就為了其可見範圍比較寬,因為可能這些變數在整個程式的執行期都是可見的,可能根本就沒有機會釋放全域性變數所占用的記憶體,所以使用動態分配記憶體是意義不大的,只能給程式帶來額外的執行負擔。

但對於全域性變數記憶體大小不能確定的情況,可能會有例外。比如要處理一批資料,資料的大小可能由使用者通過控制台引數形式告訴程式,這種情況可以動態按需分配記憶體,合理使用記憶體。

而對於編譯時能夠確定記憶體使用量的全域性變數,而且變數工作期(暫且這麼叫吧,就是該變數還可能會被用到的這段時期)又與程式的執行期相同的情況根本沒有必要動態分配記憶體。這種情況很有意思,就是使用動態分配記憶體,但可以不考慮釋放這塊記憶體,因為可以釋放記憶體的時候該程式也要退出了,程式一結束,程序也就結束了,整個程式所在的虛擬空間已經被全部釋放,也就沒必要去新增釋放記憶體的**了。(但我確定見到過這樣的**)

2. 動態分配記憶體時,分配與釋放的**要對稱。

這裡說的分配與釋放的**對稱指,分配記憶體的**要與釋放記憶體的**在同乙個範圍的**域中,例如在乙個函式的開頭申請記憶體,就應該在這個函式的結尾釋放記憶體,否則,如果在乙個函式內部分配記憶體,在函式外釋放記憶體,就有可能因程式設計師的疏忽造成記憶體洩漏;如果記憶體分配在某個類的建構函式中,那麼就應該在析構函式中釋放記憶體,千不要在另外乙個函式中釋放,而等著客戶**去掉用那個函式去手動釋放記憶體,如果那樣的話就相當於埋了乙個定時炸彈,隨時可能因為一時的疏忽而造成記憶體洩漏。

3. 對動態建立的物件或分配的記憶體塊一定要檢查期有效性。

由於作業系統的併發性和複雜性,任何一次動態記憶體的分配操作都有可能失敗,特別是申請一次較大塊記憶體時。所以一定要檢查動態建立的物件或申請的堆記憶體是否成功,否則可能因為錯誤的指標或空指標造成程式異常,如果異常沒有得到適當處理的話,可能使整個程式意外終止,造成損失。

4. 盡可能少次數地使用動態記憶體分配。

動態分配是在執行時由作業系統完成的,所以是要消耗cpu資源的,在進行動態記憶體分配時盡可能便利已經分配的資源。如果上次申請的資源夠用就不要重新申請資源,不夠用時才釋放舊資源,申請新資源。

5. 在保證資源利用率的前提下,能用靜態記憶體分配不用動態分配,特別是區域性臨時物件。

例如,對於區域性物件,使用靜態分配的記憶體,可以由編譯器編譯時分配,超出作用域自動記憶體,不僅減小了程式**,減少了錯誤產生的概率,減輕了程式設計師的負擔,而且提高的程式的執行效率,何樂而不為呢?

動態分配與靜態分配記憶體

記憶體的靜態分配和動態分配的區別主要是兩個 一是時間不同。靜態分配發生在程式編譯和連線的時候。動態分配則發生在程式調入和執行的時候。二是空間不同。堆都是動態分配的,沒有靜態分配的堆。棧有2種分配方式 靜態分配和動態分配。靜態分配是編譯器完成的,比如區域性變數的分配。動態分配由函式malloc進行分配...

靜態分配和動態分配記憶體的區別

說白了,記憶體的靜態分配和動態分配的區別主要是兩個 一是時間不同。靜態分配發生在程式編譯和連線的時候。動態分配則發生在程式調入和執行的時候。二是空間不同。堆都是動態分配的,沒有靜態分配的堆。棧有2種分配方式 靜態分配和動態分配。靜態分配是編譯器完成的,比如區域性變數的分配。動態分配由函式malloc...

記憶體的動態分配與靜態分配

記憶體的靜態分配和動態分配的區別主要是兩個 一是時間不同。靜態分配發生在程式編譯和連線的時候。動態分配則發生在程式調入和執行的時候。二是空間不同。堆都是動態分配的,沒有靜態分配的堆。棧有2種分配方式 靜態分配和動態分配。靜態分配是編譯器完成的,比如區域性變數的分配。動態分配由函式malloc進行分配...