On Tuesday, Sep 2, 2003, at 12:51 America/Denver, David Abrahams wrote:
Gregory Colvin <[EMAIL PROTECTED]> writes:
On Tuesday, Sep 2, 2003, at 11:22 America/Denver, David Abrahams wrote:Gregory Colvin <[EMAIL PROTECTED]> writes:
So you would rather use this than use construct?
template <typename T> T* addressof(T& v) { return reinterpret_cast<T*>( &const_cast<char&>(reinterpret_cast<const volatile char &>(v))); }
As long as it's packaged away and I don't have to look at the
implementation. A customization point like an allocator should not be
required to supply boilerplate that's always going to be the same.
You are assuming that there was no good reason to allow an allocator to hook construct and destroy, for instance to do some bookkeeping.
The fact that nobody's required to use construct and/or destroy is testament to that.
Thanks to the weasel-wording nobody's required to use much of anything besides allocate, deallocate, and rebind. That doesn't mean there was no point to all the rest in the original design.
When I need to find out what I need to implement in order to customize allocation, I don't want to have to read through something which is 50% irrelevant to the task, as the allocator requirements are.
Which is why I'm now suggesting that Boost UserAllocator is a better default.
But in some cases, like the shared_ptr feature request that got me thinking on this, what you want is just to have objects allocate their internals using the same allocator as the container they are being placed in, in which case you don't need to implement an allocator, just call get_allocator().
Is it enough for all of Boost?
It's probably overkill for some things.
If so, great! If not, we still need to think about what a more-sophisticated interface looks like.
Only if UserAllocator is inadequate?
Also, if shared_ptr only needs to allocate at construction time (I'm not sure of this) we can avoid storing the allocator at all.
Then how to deallocate?
I'm reeling from the implication that the following is undefined behavior for non-POD T:
T* p = (T*)malloc(sizeof T);
Are you sure?
Nope. 3.8/5 shows that I'm wrong.
That's a relief.
It still doesn't make any sense to return a T* from allocate since normally with a non-singular T* p, either p == 0 or *p refers to a constructed T.
The idea was that Allocator<T>::pointer might be a proxy type that cannot be converted to void* and back, so allocate() must return and construct() must take an Allocator<T>::pointer rather than a void*.
_______________________________________________ Unsubscribe & other changes: http://lists.boost.org/mailman/listinfo.cgi/boost