乙個簡單的物件池

2021-05-09 11:39:25 字數 1682 閱讀 9330

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

#include

#include "mutex.h"

#define min_increasize 30               //每次最少分配30個物件

//空鎖類

class nullmutex

void unlock(){}

};template

class cachedobj;

friend void* objt::operator new(size_t);

friend void objt::operator delete(void*,size_t);

static void* alloc()

catch(...)

listentry *ret = m_objlist;

m_objlist = ret->next;

m_mutex.unlock();

return &ret->obj;

}static void free(void* ptr)

static void increase();

static mutext m_mutex;

static listentry* m_objlist;

};template

typename cachedobj::listentry* cachedobj::m_objlist = null;

template

mutext cachedobj::m_mutex;

template

void cachedobj::increase()

return;

}std::new_handler handler = std::set_new_handler(0);

std::set_new_handler(handler);

if(handler) (*handler)();

else throw std::bad_alloc();}}

#define cachedobj_declare(classt,increa) /

public: /

void* operator new(size_t size)/

void operator delete(void* ptr,size_t size) /

#define safecachedobj_declare(classt,increa) /

public: /

void* operator new(size_t size)/

void operator delete(void* ptr,size_t size) /

這裡採用了過載new,delete的方式實現物件快取,這樣只需要很少的改動就可以使現有類支援物件重用。

cachedobj類中定義了listentry鍊錶節點類,空閒物件通過鍊錶鏈結起來。新分配的物件和**的物件加入到鍊錶的頭部,每次需要物件時從鍊錶頭部獲取。當鍊表中沒有空閒鍊錶時在從堆中分配新的物件。

使用時只需要在類宣告中加入巨集cachedobj_declare(classt,increa) ,引數classt為類名,increa為每次重新分配的物件個數。safecachedobj_declare為對應的執行緒安全版本。

乙個簡單的物件池

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

乙個簡單的記憶體池

為什仫要使用記憶體池?1.通常我們用new delete和malloc free來管理記憶體,可能會需要頻繁的呼叫記憶體,減少執行時間,增加效率.2.避免記憶體碎片 傳統的new delete的弊端 1.分配記憶體時要檢視空閒分割槽表,根據一定的演算法來分配,比如最佳適應演算法,最差適應演算法.然後...

乙個簡單的執行緒池

話說這個執行緒池也寫了好久了 做簡單的東西的時候也在用,最近因為乙個失誤刪掉了自己的一些檔案導致重新寫了一遍 所以貼出來,以防萬一 並且跟大佬們交流 created by cxhmyself on 18 4 10.include 都需要與互斥量一起才能工作 include include inclu...