3 回答
TA貢獻1772條經驗 獲得超8個贊
假設您有一個“大”(32個字節)的空閑內存:
----------------------------------
| |
----------------------------------
現在,分配其中的一些(5次分配):
----------------------------------
|aaaabbccccccddeeee |
----------------------------------
現在,釋放前四個撥款,但不釋放第五個撥款:
----------------------------------
| eeee |
----------------------------------
現在,嘗試分配16個字節。哦,我做不到,盡管有兩倍的免費。
在具有虛擬內存的系統上,碎片問題不像您想象的那么嚴重,因為大型分配只需要在虛擬地址空間,不在物理地址空間。所以在我的例子中,如果我有一個頁大小為2字節的虛擬內存,那么我就可以使我的16字節分配沒有問題。物理內存如下所示:
----------------------------------
|ffffffffffffffeeeeff |
----------------------------------
而虛擬內存(大得多)可能如下所示:
------------------------------------------------------...
| eeeeffffffffffffffff
------------------------------------------------------...
內存碎片的典型癥狀是,您試圖分配一個大塊,但無法分配,即使您似乎有足夠的內存空閑。另一個可能的后果是進程無法將內存釋放回操作系統(因為在它從操作系統分配的所有塊中仍然有一些對象在使用,盡管這些塊現在大部分是未使用的)。
防止C+中內存碎片的策略是根據對象的大小和/或預期壽命分配來自不同區域的對象。所以,如果你要創建大量的對象,然后一起銷毀它們,那么就從一個內存池中分配它們。您在它們之間執行的任何其他分配都不會來自池,因此不會位于它們之間的內存中,因此內存不會因此而被分割。
一般情況下,您不需要擔心它,除非您的程序是長期運行,并做了大量的分配和釋放。當你將短命和長壽的物體混合在一起時,你面臨的風險最大,但即便如此,也是如此。malloc會盡全力幫助你?;旧?,忽略它直到您的程序有分配失敗或意外導致系統在內存上運行不足(在測試中捕捉到這一點,用于首選!)。
標準庫并不比任何分配內存的庫更糟糕,標準容器都有一個Alloc模板參數,您可以使用它來微調它們的分配策略(如果絕對必要的話)。
- 3 回答
- 0 關注
- 1494 瀏覽
添加回答
舉報
