/*
使用說明:
1>.四個介面malloc()/free()/mempool_new()/mempool_delete()分別對應標準庫函式malloc()/free()和操作符new()/delete()
2>.如果是qt專案請開啟#define qt巨集定義
3>.如果是win32專案則預設就可以
4>.如果是linux c/c++(非第三方類庫)請用pthread實現乙個_lock類替換
注意事項:
1>.介面mempool_new是類似於系統呼叫new的介面,但是由於物件建構函式這裡只實現到0~4個引數,如果超過則需修改本類模板,新增更多引數的構造實現.
2>.建構函式的引數型別如果存在volatile/const等修飾,則同樣需要自己實現乙個.
舉 例:
cmemorypoolmymempool;
std::list* plst = mymempool.mempool_new();//複雜物件,會呼叫其構造.
struct my******struct* pstru = mymempool.malloc(sizeof(my******struct));//簡單物件.
*/#ifndef memorypool_hpp
#define memorypool_hpp
//#define qt //加入到windows專案或者其他專案的開關
#include
#include
#include
#ifndef qt
#include
#else
#include
#endif
using
namespace
std;
#define in
#define out
#define max_block_type 16
#define max_unit_num 1024
#ifndef qt
class _lock
~_lock(void)
inline
void lock()
inline
void unlock()
protected:
critical_section m_cslock;
};#else
class _lock
~_lock(void)
inline
void lock()
inline
void unlock()
protected:
qmutex m_mxlock;
};#endif
typedef
struct mem_block
~mem_block()
} mem_block, *lpmem_block;
typedef
struct mem_pool
} mem_pool, *lpmem_pool;
template
class cmemorypool
catch (...)
return p;
}template
inline t* mempool_new(in const t0 & a0)
catch (...)
return p;
}template
inline t* mempool_new(in const t0 & a0,in const t1 & a1)
catch (...)
return p;
}template
inline t* mempool_new(in const t0 & a0,in const t1 & a1,in const t2 & a2)
catch (...)
return p;
}template
inline t* mempool_new(in const t0 & a0,in const t1 & a1,in const t2 & a2,in const t3 & a3)
catch (...)
return p;
}void mempool_delete(in t* p);
void* malloc(in const
int ilen);
void free(in void* p);
bool isempty();
protected:
mem_pool m_mempool;
_lock m_csmaplock;
map m_mapmalloc;
int m_imaxusemem;
};template
cmemorypool::cmemorypool(void)
template
cmemorypool::~cmemorypool(void)
}return;
}template
void cmemorypool::setusememlimte(in int imaxusemem)
template
void cmemorypool::mempool_delete(in t* p)
template
void* cmemorypool::malloc(in int ilen)
// 申請的記憶體超過了上限
if (i == max_block_type)
return p;
// 申請初始記憶體塊
m_mempool.m_cslock.lock();
if (!m_mempool.m_pmemblock[i])
m_mempool.m_cslock.unlock();
lpmem_block pb = m_mempool.m_pmemblock[i];
if (!pb)
return p;
while (pb)
// 這個記憶體塊用完了
if (!pb->m_pnext)
pb->m_pnext = new (std::nothrow)mem_block(m_mempool.m_iunitsize[i]);
if (!pb->m_pnext)
m_mempool.m_iusedmem += m_mempool.m_iunitsize[i] * max_unit_num;
}pb->m_cslock.unlock();
pb = pb->m_pnext;
}return p;
}template
void cmemorypool::free(in void *p)
m_csmaplock.unlock();
if (!pb)
return;
pb->m_cslock.lock();
memset(p, 0, pb->m_iunitsize);
pb->m_dqaddr.push_back((char*)p);
pb->m_cslock.unlock();
return;
}template
bool cmemorypool::isempty()
#endif //memorypool_hpp
C 記憶體池的實現
file memorypool.h note hangzhou hikvision system technology co.ltd.all right reserved.brief windows下記憶體池的實現 author zhangpeng nj 163.com date 11 15 201...
記憶體池的C 實現。
原文 最近在學習c 程式效能優化,讀到記憶體池部分。自己動手寫了乙個,小小測試了一下應該沒有問題。記憶體塊memoryblock宣告檔案 cpp view plain copy pragma once define ushort unsigned short define ulong unsigne...
C 記憶體池的實現
記憶體池是一種自主的記憶體管理機制。就是將我們的記憶體管理放在了應用程式端。那麼它的簡單處理做了什麼事呢?首先,我們從堆上分配出一塊很大的記憶體塊。接著我們按照劃分將其劃分成每個不同的小組。這個每個小組儲存乙個資料塊。針對於每個小組的組內來說就是乙個簡單的資料結構。這個資料結構我們將其分為兩個部分,...