c++程式預設的記憶體管理(new,delete,malloc,free)會頻繁地在堆上分配和釋放記憶體,導致效能的損失,產生大量的記憶體碎片,降低記憶體的利用率。預設的記憶體管理因為被設計的比較通用,所以在效能上並不能做到極致。
因此,很多時候需要根據業務需求設計專用記憶體管理器,便於針對特定資料結構和使用場合的記憶體管理,比如:記憶體池。
記憶體池的思想是,在真正使用記憶體之前,預先申請分配一定數量、大小預設的記憶體塊留作備用。當有新的記憶體需求時,就從記憶體池中分出一部分記憶體塊,若記憶體塊不夠再繼續申請新的記憶體,當記憶體釋放後就回歸到記憶體塊留作後續的復用,使得記憶體使用效率得到提公升,一般也不會產生不可控制的記憶體碎片。
演算法原理:
預申請乙個記憶體區chunk,將記憶體中按照物件大小劃分成多個記憶體塊block
維持乙個空閒記憶體塊鍊錶,通過指標相連,標記頭指標為第乙個空閒塊
每次新申請乙個物件的空間,則將該記憶體塊從空閒鍊錶中去除,更新空閒煉表頭指標
每次釋放乙個物件的空間,則重新將該記憶體塊加到空閒煉表頭
如果乙個記憶體區佔滿了,則新開闢乙個記憶體區,維持乙個記憶體區的鍊錶,同指標相連,頭指標指向最新的記憶體區,新的記憶體塊從該區內重新劃分和申請
如圖所示:
執行結果
p1 00000174bede0440 1
p2 00000174bede0450 2
p3 00000174bede0450 3
p4 00000174bede0460 4
p5 00000174bedd5310 5
p6 00000174bedd5320 6
可以看到記憶體位址是連續,並且**乙個節點後,依然有序地開闢記憶體
物件先開闢記憶體再構造,先析構再釋放記憶體
注意
記憶體池的原理及實現
在軟體開發中,有些物件使用非常頻繁,那麼我們可以預先在堆中例項化一些物件,我們把維護這些物件的結構叫 記憶體池 在需要用的時候,直接從記憶體池中拿,而不用從新例項化,在要銷毀的時候,不是直接free delete,而是返還給記憶體池。把那些常用的物件存在記憶體池中,就不用頻繁的分配 記憶體,可以相對...
記憶體池 簡單的記憶體池的實現
當頻繁地用malloc申請記憶體,然後再用free釋放記憶體時,會存在兩個主要問題。第乙個問題是頻繁的分配釋放記憶體可能導致系統記憶體碎片過多 第二個問題是分配釋放記憶體花費的時間可能比較多 這個問題不太明顯 這個時候我們就可以考慮使用記憶體池了。最樸素的記憶體池思想就是,首先你向系統申請一塊很大的...
最簡單的記憶體池 原理與實現
記憶體池的主要作用,簡單地說來,便是提高記憶體的使用效率。堆記憶體的申請與釋放 new delete及malloc free 涉及複雜的記憶體分配演算法,相比由簡單cpu指令支援的棧記憶體的申請與釋放,則是慢上了數量級。另一方面,棧的大小是有限制的,在需要大量記憶體的操作時,堆的使用是必要的。當然,...