$include_dir="/home/hyper-archives/boost/include"; include("$include_dir/msg-header.inc") ?>
Subject: Re: [boost] [utility] new auto_buffer class --- RFC
From: Mathias Gaunard (mathias.gaunard_at_[hidden])
Date: 2009-03-02 11:19:34
Thorsten Ottosen wrote:
> Mathias Gaunard skrev:
>> Thorsten Ottosen wrote:
>>
>>> Well, AFAIK, they are very similar. You set the capacity once when 
>>> you initialize am object:
>>>
>>>   boost::auto_buffer<T> buffer( get_max_capacity_from_somewhere() );
>>>
>>> isn't that exactly what you do with VLAs?
>>
>> With VLAs, the buffer is on the stack whatever the capacity. With 
>> auto_buffer, the buffer is on the stack only if the capacity is 
>> smaller than N (which you define to be 256 by default).
> 
> Yes. I'm talking about the conceptual behavior of the class.
A VLA is a fixed-size array whose size is determined at runtime.
It is conceptually more like scoped_array than auto_buffer.
Basically, we have all these array type possibilities (fixed capacity 
implies dynamic size):
- fixed compile-time size: C/C++ arrays or boost::array
- fixed runtime size: VLAs or scoped_array (we need better, something 
without pointers in the interface and with copy semantics)
- fixed compile-time capacity: nothing (something would be useful)
- fixed runtime capacity: auto_buffer
- variable capacity (necessarily at runtime): std::vector
All of these situations have different strategies for memory management:
- allocate everything within the object itself, that is to say on the 
execution stack (only possible for fixed compile-time size or capacity)
- allocate everything in an area external to the object, such as was is 
colloquially known as the heap, and reference that area (possible for 
every situation, and may be a better strategy even if the first is possible)
- allocate the buffer in the object itself if the buffer is smaller than 
a certain fixed compile-time size, and use an external memory source 
otherwise. That technique is typically known as Small Buffer 
Optimization (possible for every situation)
So auto_buffer is a fixed runtime capacity array which uses the third 
strategy.
I suggest all array type possibilities be implemented with all memory 
management strategies.
Which means obviously making some kind of policy-based design, with SBO 
something independent that you can plug into auto_buffer.
I have worked on some kind of allocator interface that allows SBO, if 
there is interest.