Boost logo

Boost :

Subject: Re: [boost] [pool] doubling algorithm
From: Chris Newbold (Chris.Newbold_at_[hidden])
Date: 2008-10-22 14:50:42


> From: boost-bounces_at_[hidden] [mailto:boost-bounces_at_[hidden]]
> On Behalf Of Boris
> Sent: Wednesday, October 22, 2008 1:27 PM

> Are there any plans to make the pool's doubling algorithm configurable? It
> would be great if it was possible for example to set an upper limit or to
> use constant chunk sizes (thus no algorithm at all). If there are no plans
> may I propose then some patches? I ask as I need to configure the pool as
> it eats too much memory sometimes.

Parameterizing the growth algorithm for the pool is pretty high on my to-do list, as we have also found the default doubling algorithm to been overly-aggressive.

My thinking is only half-baked, but it seemed natural to me to implement this via template-based policies. The two alternatives that came to mind were to either (1) integrate support for controlling growth into the existing UserAllocator concept; or (2) add an additional template parameter to boost::pool to allow the growth strategy to be configured independently of the UserAllocator.

Solution (1) would result in the following additional required semantics for a UserAllocator implementation:

Expression Return Type Pre-Condition/Notes
--------------------------- ----------- ---------------------------------
UserAllocator::nextSize(
    n,
    partition_sz)
                            size_type Growth strategy support; given
                                         an existing allocation size of n
                                         elements each of partition_sz,
                                         return the suggested number of
                                         elements for the next allocation
                                         request. If n is zero, returns
                                         the suggested initial allocation
                                         size.
---------------------------------------------------------------------------

Solution (2) introduces a new concept, GrowthStrategy, as an additional template argument for boost::pool (and the other related pool types):

template <typename UserAllocator = default_user_allocator_new_delete,
          typename GrowthStrategy = default_growth_strategy>
class pool;

GrowthStrategy would have the following semantics:

Expression Return Type Pre-Condition/Notes
--------------------------- ----------- ---------------------------------
GrowthStrategy::nextSize(
    n,
    partition_sz)
                            size_type (same as above)
--------------------------------------------------------------------------

I'd be interested in hearing your thoughts and ideas...

-Chris


Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk