原創 乙個超級物件池的實現

2021-09-06 15:05:54 字數 2812 閱讀 6224

物件池對於建立開銷比較大的物件來說很有意義,為了避免重複建立開銷比較大的物件,我們可以通過物件池來優化。物件池的思路比較簡單,事先建立好一批物件,放到乙個集合中,以後每當程式需要新的物件時候,都從物件池裡獲取,每當程式用完該物件後,都把該物件歸還給物件池。這樣會避免重複的物件建立,提高程式效能。先來看看物件池的簡單實現:

#include template

class

objectpool

}~objectpool()

m_unsize = 0

; }

object *getobject()

else

return

pobj;

}void returnobject(object *pobj)

private

: size_t m_unsize;

std::list

m_opool;

};

view code

這個object pool的實現很典型,初始建立一定數量的物件,取的時候就直接從池子中取,用完之後再**到池子。一般的物件池的實現思路和這個類似,這種實現方式雖然能達到目的,但是存在以下不足:

物件池objectpool只能容納特定型別的物件,不能容納所有型別的物件,可以支援過載的和引數不同的建構函式;

物件用完之後需要手動**,用起來不夠方便,更大的問題是存在忘記**的風險;

我希望能有乙個更強大的物件池,這個物件池能容納所有的物件,還能自動**用完了物件,不需要手動**,用起來更方便。要實現這樣的物件池需要解決前面提到的兩個問題,通過c++11就可以解決這兩個問題。

對於問題1:容納所有的物件。本質上需要將物件池中的物件型別擦除,這裡用any型別就可以解決。

對於問題2:自動**用完的物件。這裡用智慧型指標就可以解決,在建立智慧型指標時可以指定刪除器,在刪除器中不刪除物件,而是**到物件池中,而這個過程對外界來說是看不見的,由智慧型指標自己完成。關於any的實現見我前面的部落格內容:c++11打造好用的any。

下面來看看超級物件池的具體實現吧。

#include #include 

#include

#include

#include

"any.hpp

"const

int maxobjectnum = 10

;class

objectpool

~objectpool()

//預設建立多少個物件

templatevoid create(int

num)

;m_map.emplace(typeid(t).name(), f);

m_counter.emplace(constructname, num);

}template

std::shared_ptr

createptr(std::string&constructname, args... args));}

template

std::shared_ptr

get(args... args)

}return

nullptr;

}private

: template

std::shared_ptr

createinstance(any&any,

std::

string&constructname, args... args)

template

void initpool(t& f, std::string&constructname, args... args)

m_counter[constructname] = 0

; }

}template

std::shared_ptr

getinstance(std::string&constructname, args... args)

private

: std::multimap

string, any>m_map;

std::multimap

string, any>m_object_map;

std::map

string, int>m_counter;

bool

needclear;

};

測試**:

struct

at at(

int a, int

b) :m_a(a), m_b(b){}

void

fun()

int m_a = 0

;

int m_b = 0;};

struct

bt};

void

testobjectpool()

auto pb = pool.get();

pb->fun();

auto p = pool.get();

p->fun();

int a = 5, b = 6

; auto p2 = pool.get(a, b);

p2->fun();

auto p3 = pool.get(3, 4

); p3->fun();

auto p4 = pool.get(7, 8

); p4->fun();

}

測試結果:

可以看到這個物件池不僅僅能容納所有型別的物件還能自動**用完的物件,強大而又方便。

乙個簡單的物件池

在伺服器的的執行過程中,由於大量的計算會導致某些物件頻繁地分配和釋放,久而久之就會產生大量的記憶體碎片,從而影響伺服器的效率和穩定。本文通過實現乙個輕量級的物件池重用物件來解決這個問題。include include mutex.h define min increasize 30 每次最少分配30...

乙個簡單的物件池

從書上直接摘抄下來的物件池,以後別給忘了 template class objectpool template objectpool objectpool int chunksize throw std invalid argument,std bad alloc mchunksize chunks...

實現乙個執行緒池

一.執行緒最主要的三個同步機制 1.訊號量 2.互斥鎖 3.條件變數 二.對三個同步機制分別實現乙個包裝類 ifdef locker h define locker h include include 訊號量的封裝 class sem sem bool wait bool post private ...