10 const size_t BLOCK_SIZE;
13 #ifdef BCP_MEMPOOL_SAVE_BLOCKHEADS 21 BLOCK_SIZE(bl_size), entry_size(n), first_free(0)
22 #ifdef BCP_MEMPOOL_SAVE_BLOCKHEADS
23 , block_heads(0), block_num(0), max_block_num(0)
30 return ::operator
new(n);
31 void ** p = first_free;
33 first_free = static_cast<void **>(*p);
36 const size_t ptr_in_entry = entry_size/
sizeof(
void**) +
37 ((entry_size %
sizeof(
void **)) == 0 ? 0 : 1);
38 const size_t dist = ptr_in_entry *
sizeof(
void **);
39 void ** block = static_cast<void**>(::
operator new(BLOCK_SIZE*dist));
40 #ifdef BCP_MEMPOOL_SAVE_BLOCKHEADS 43 if (max_block_num == block_num) {
44 max_block_num = 1.2 * block_num + 10;
45 const void *** old_block_heads = block_heads;
46 block_heads = static_cast<void ***>(::
operator new(max_block_num));
47 for (
size_t i = 0; i < block_num; ++i)
48 block_heads[i] = old_block_heads[i];
49 ::operator
delete(old_block_heads);
52 block_heads[block_num++] = block;
56 for (
size_t i = 1; i < BLOCK_SIZE-1; ++i)
57 block[i*ptr_in_entry] =
58 static_cast<void*>(block + ((i+1)*ptr_in_entry));
60 block[(BLOCK_SIZE-1)*ptr_in_entry] = 0;
62 first_free = block + ptr_in_entry;
64 return static_cast<void*>(p);
68 inline void free(
void *p,
size_t n) {
70 if (n != entry_size) {
74 void** pp = static_cast<void**>(p);
75 *pp = static_cast<void*>(first_free);
80 #ifdef BCP_MEMPOOL_SAVE_BLOCKHEADS 81 for (
size_t i = 0; i < block_num; ++i) {
82 ::operator
delete(block_heads[i]);
84 ::operator
delete(block_heads);
BCP_MemPool(const size_t n, const size_t bl_size=1023)
void free(void *p, size_t n)