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