前言:閱讀stl原始碼中記憶體池的實現,感觸頗深,但又不知如何描述,stl原始碼剖析中已經描述的非常清楚了。所以這裡我把其原始碼整理了一下,去除了多執行緒,方便閱讀其實現原理。
記憶體池標頭檔案
class memorypool
union obj ;
private:
static obj * volatile free_list[16];
static size_t freelist_index(size_t bytes)
static
void *refill(size_t n);
static
char *chunk_alloc(size_t size, int &nobjs);
// 分配狀態
static
char *start_free;
static
char *end_free;
static size_t heap_size;
public:
//n必須大於0
static
void * allocate(size_t n)
my_free_list = free_list + freelist_index(n);
result = *my_free_list;
if (result == 0)
*my_free_list = result -> free_list_link;
return (result);
};/* p 不能為 0 */
static
void deallocate(void *p, size_t n)
my_free_list = free_list + freelist_index(n);
q -> free_list_link = *my_free_list;
*my_free_list = q;
}static
void * reallocate(void *p, size_t old_sz, size_t new_sz);
} ;
其中在分配空間的時候用到了全域性的分配函式,::deallocate(p, n);
和::allocate(n)
這在這一節中給出。
整個記憶體池的實現**其實並不長,但是,不仔細研究是很難理解其中的奧秘,親身體會,需要備註沒有多少,研究原始碼是最好的解釋。
char* memorypool::chunk_alloc(size_t size, int& nobjs)
else
if (bytes_left >= size) else
start_free = (char *)malloc(bytes_to_get);
if (0 == start_free)
}end_free = 0;
start_free = (char *)malloc_alloc::allocate(bytes_to_get);
}heap_size += bytes_to_get;
end_free = start_free + bytes_to_get;
return(chunk_alloc(size, nobjs));
}}void* memorypool::refill(size_t n)
else
}return(result);
}void* memorypool::reallocate(void *p,size_t old_sz,size_t new_sz)
if (round_up(old_sz) == round_up(new_sz)) return(p);
result = allocate(new_sz);
copy_sz = new_sz > old_sz? old_sz : new_sz;
memcpy(result, p, copy_sz);
deallocate(p, old_sz);
return(result);
}char *memorypool::start_free = 0;
char *memorypool::end_free = 0;
size_t memorypool::heap_size = 0;
memorypool::obj * volatile free_list = ;
記憶體池系列
1 實現乙個單執行緒可變大小記憶體管理器 標頭檔案 ifndef memorypook h define memorypook h class memorychunk memorychunk nextmemchunk enum private void mem memorychunk nextchu...
記憶體池技術
經典的記憶體池技術 經典的記憶體池 mempool 技術,是一種用於分配大量大小相同的小物件的技術。通過該技術可以極大加快記憶體分配 釋放 過程。下面我們詳細解釋其中的奧妙。經典的記憶體池只涉及兩個常量 memblocksize itemsize 小物件的大小,但不能小於指標的大小,在32位平台也就...
記憶體池技術
記憶體池技術是一種飽受爭議的技術 爭議熱點在於到底有沒有必要自己實現。1.記憶體池技術出現在libc尚不成熟的時候,當時程式經常在執行一段時間後效能下降,當時維護記憶體池很有必要 2.現在64位伺服器經常是32g以上的記憶體,管理記憶體碎片意義不打 3.寫malloc的各位都是大神,自己寫有99 的...