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);