亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

什么是內存碎片?

什么是內存碎片?

C++
慕無忌1623718 2019-07-13 18:52:51
我聽說過在C+動態內存分配上下文中使用過幾次“內存碎片”一詞。我發現了一些關于如何處理內存碎片的問題,但是找不到一個直接的問題來處理它本身。因此:什么是內存碎片?如何判斷內存碎片是否是應用程序的問題?什么樣的節目最有可能受到影響?處理內存碎片的好方法是什么?此外:我聽說過大量使用動態分配可以增加內存碎片。這是真的嗎?在C+的上下文中,我理解所有標準容器(std:string、std:Vector等)都使用動態內存分配。如果這些內容在整個程序(特別是std:string)中使用,那么內存碎片更有可能是一個問題嗎?如何在STL密集型應用程序中處理內存碎片?
查看完整描述

3 回答

?
料青山看我應如是

TA貢獻1772條經驗 獲得超8個贊


假設您有一個“大”(32個字節)的空閑內存:


----------------------------------

|                                |

----------------------------------

現在,分配其中的一些(5次分配):


----------------------------------

|aaaabbccccccddeeee              |

----------------------------------

現在,釋放前四個撥款,但不釋放第五個撥款:


----------------------------------

|              eeee              |

----------------------------------

現在,嘗試分配16個字節。哦,我做不到,盡管有兩倍的免費。


在具有虛擬內存的系統上,碎片問題不像您想象的那么嚴重,因為大型分配只需要在虛擬地址空間,不在物理地址空間。所以在我的例子中,如果我有一個頁大小為2字節的虛擬內存,那么我就可以使我的16字節分配沒有問題。物理內存如下所示:


----------------------------------

|ffffffffffffffeeeeff            |

----------------------------------

而虛擬內存(大得多)可能如下所示:


------------------------------------------------------...

|              eeeeffffffffffffffff                   

------------------------------------------------------...

內存碎片的典型癥狀是,您試圖分配一個大塊,但無法分配,即使您似乎有足夠的內存空閑。另一個可能的后果是進程無法將內存釋放回操作系統(因為在它從操作系統分配的所有塊中仍然有一些對象在使用,盡管這些塊現在大部分是未使用的)。


防止C+中內存碎片的策略是根據對象的大小和/或預期壽命分配來自不同區域的對象。所以,如果你要創建大量的對象,然后一起銷毀它們,那么就從一個內存池中分配它們。您在它們之間執行的任何其他分配都不會來自池,因此不會位于它們之間的內存中,因此內存不會因此而被分割。


一般情況下,您不需要擔心它,除非您的程序是長期運行,并做了大量的分配和釋放。當你將短命和長壽的物體混合在一起時,你面臨的風險最大,但即便如此,也是如此。malloc會盡全力幫助你?;旧?,忽略它直到您的程序有分配失敗或意外導致系統在內存上運行不足(在測試中捕捉到這一點,用于首選!)。


標準庫并不比任何分配內存的庫更糟糕,標準容器都有一個Alloc模板參數,您可以使用它來微調它們的分配策略(如果絕對必要的話)。


查看完整回答
反對 回復 2019-07-13
  • 3 回答
  • 0 關注
  • 1494 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號