【原創】在工廠模式中使用FREELIST

一、前言

以下內容僅爲理論,並未實踐,考慮在現在的項目中實踐或做一個測試的DEMO,見諒見諒。

但開了一個不錯的思路???我絕對不是第一個想到這個理論的,只是我突然覺得它有改進的餘地。

請不要再一般的環境中使用以下技術,對一般程序而言絕對沒用,請在大量使用內存並希望可以通過預申請內存達到穩定的應用程序中使用以下理論。

二、選擇庫

我們常常有使用freelist的習慣,尤其在服務器端中使用內存預申請機制時一定會用到這種方式,首先我要推薦幾種內存管理較好的類或庫,比如:

1、boost.pool

爲什麼是pool而不是object_pool是因爲pool本身的內存管理方式非常不錯,最重要的是效率,具體的原理我就不闡述了,主要是object_pool在free的情況下效率極低,這個不信的大可以試試。

當然由於我們的項目是使用內存相當大的(3G~10G),所以在選擇內存管理時進行了大量的工作,我在測試了衆多的內存管理後還是選擇了boost.pool。

2、原語freelist

具體實現目前網上沒有,我是在一本書上看到的,但我測試過,效率很高(比boost.pool高出很多),但我做的測試不足,缺陷是跨平臺方面需要實現的內容太多,由於項目較緊所以沒有使用這套系統。

我使用的庫並不是特別多,所以在這方面可能知道的比較少,見諒見諒,但我使用的庫中認爲最好的就是這2種,我們的目標其實很簡單,輕量級並且效率很高,如果稍有效率降低的問題,即拋棄不用,依賴過多也拋棄不用,所以纔有以上兩種選擇。

三、在工廠模式中使用內存池

在一般的情況下很難再工廠模式中使用預申請內存池,原因比較多,諸如預申請內存池多直接使用模板方式實現,存在對於子類大小適應的侷限性,其次使用常規內存池又有內存池不會主動調用構造函數或析構函數的問題,那麼如何自動化實現這一切呢?

我在這裏選擇boost.pool作爲內存池的基礎類,並實現內存池的幾種思路,詳細測試和改進將在未來給出。

以下代碼爲僞代碼請勿直接使用:

class Go_Memory

{

public:

Go_Memory( int size );

~Go_Memory();

public:

type alloc( int size,class A );

type alloc( int size,class A,class B );

}

alloc函數負責分配類型爲type的類指針給外部,並自動調用構造函數傳入構造函數參數A,這是實現第一步,即通過內存池有效地分配內存給外部。

我建議建立專門的庫來實現這種機制,但是發現其實我們無法自由的在工廠中實現它是麼?

那麼我們可以給Go_Memory實現幾個點綴

第一,給Go_Memory加上單件模式

第二,實現自動化的宏去調用這種內存機制,這樣在調用時只需要使用簡單宏即可完成操作方便快捷

以下代碼爲僞代碼請勿直接使用:

#define GO_NEW Go_Memory::instance()->alloc

#define GO_DELETE Go_Memory::instance()->free

當然這種實現方式的最大缺陷是,我們需要對這個內存管理機制花費很大的心血,因爲我們要實現至少9中參數情況下的alloc同時無法像new operator 那樣自由和全局調用,但可以在抽象工廠模式中使用這種內存管理機制,以達到自由靈活提升維護性並不失內存管理的本質。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章