String系列 記憶體池技術

2021-07-04 05:50:27 字數 2213 閱讀 3597

前言:閱讀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 的...