2008-02-28 16:08
202人閱讀收藏
舉報 這是試驗性的程式, 雖然演算法實現簡弱, 當在編譯器優化後實驗結果,
效能比用全域性new delete的記憶體管理好了很多,我這裡有考慮到多執行緒
看來在大量使用記憶體分配的程式,用記憶體池是能夠顯著提高效能的;
有時間我會改進演算法,有高手看到, 請指點一二, 我是非專業的, 演算法方面很弱;
還有陣列的記憶體分配遇到了一些問題;
以下陣列的記憶體分配的一般模式
void * operator new(size_t size);
void operator delete(void *p, size_t size);
可惜的是new裡的size和delete你的size在vc, bc下並不匹配(g++則一樣, 比較好);
這是的分配陣列是需要儲存指標及對應的大小(一般用hash), 這要消耗不少時間;
#pragma warning(disable: 4530)
#pragma warning(disable: 4786)
#include
#include
#include
#include
#include
#include
#include
using namespace std;
#include
template
class memorypool;};
struct lock
~lock()
};char _buffer[preallocsize];
char *_begin, *_end;
critical_section _cslock;
list_memorylist;
void createlist()
void freelist()
void *ffa_alloc(size_t size)// first fit algorithm
else}}
return p;
}bool ffa_free(char *p, size_t size)
else
else //just union pre_node
(*temp_iter)->_size += size;
}else
}return true;
}// if(p < (*iter)->_begin)
} //for
if(_memorylist.size() == 0) // null list
_memorylist.insert(_memorylist.end(), new memoryblock(p, size));
else //push back of list
return true;
}void *bfa_alloc(size_t size)// best fit algorithm
bool bfa_free(char *p, size_t size)
void *wfa_alloc(size_t size)// worst fit algorithm
bool wfa_free(char *p, size_t size)
public:
memorypool()// : _memoryhash(preallocsize / 16)
~memorypool()
void *alloc(size_t size)
void free(void *address, int size)
}void printlist()
list< memorypool::memoryblock * >::iterator iter;
for(i = 0, iter = _memorylist.begin(); iter != _memorylist.end(); iter ++, i ++)
printf("%d : address %p offset %d, size %d;/n",
i, (*iter)->_address, (*iter)->_address - _begin, (*iter)->_size);}};
class object
;void operator delete(void * p, size_t size);};
memorypool<2 * 1024 * 1024> object::_mp;
int main(int argc, char* argv)
分享到:
記憶體池的簡單試驗(C )
記憶體池的簡單試驗 c 這是試驗性的程式,雖然演算法實現簡弱,當在編譯器優化後實驗結果,效能比用全域性new delete的記憶體管理好了很多,我這裡有考慮到多執行緒 看來在大量使用記憶體分配的程式,用記憶體池是能夠顯著提高效能的 有時間我會改進演算法,有高手看到,請指點一二,我是非專業的,演算法方...
記憶體池 簡單的記憶體池的實現
當頻繁地用malloc申請記憶體,然後再用free釋放記憶體時,會存在兩個主要問題。第乙個問題是頻繁的分配釋放記憶體可能導致系統記憶體碎片過多 第二個問題是分配釋放記憶體花費的時間可能比較多 這個問題不太明顯 這個時候我們就可以考慮使用記憶體池了。最樸素的記憶體池思想就是,首先你向系統申請一塊很大的...
記憶體池 C 記憶體池
c c 下記憶體管理是讓幾乎每乙個程式設計師頭疼的問題,分配足夠的記憶體 追蹤記憶體的分配 在不需要的時候釋放記憶體 這個任務相當複雜。1.呼叫malloc new,系統需要根據 最先匹配 最優匹配 或其他演算法在記憶體空閒塊表中查詢一塊空閒記憶體,呼叫free delete,系統可能需要合併空閒記...