C++0x では、Scoped Allocator Model というネストしたコンテナ(stringのvectorとかlistのmapとか)の
メモリ割り当てとして、コンテナとコンテナの各要素のアロケータを指定できるようになります。
以下は、vector
Scoped Allocator Model のために、 std::scoped_allocator_adaptor というクラスが提供されます。
namespace std { template <Allocator OuterA, Allocator InnerA = unspecified allocator type> class scoped_allocator_adaptor; }
使用例:
指定した領域から alloc するような Scoped allocator を作成する
class SimpleArena { public: SimpleArena(std::max_align_t *buffer, std::size_t nbytes); ... };
template <class T> class SimpleArenaAlloc { SimpleArena *d_guts; public: typedef std::size_t size_type; typedef int difference_type; typedef T* pointer; typedef const T* const_pointer; typedef T& reference; typedef const T& const_reference; typedef T value_type; template <class U> struct rebind { typedef SimpleArenaAlloc<U> other; }; SimpleArenaAlloc(SimpleArena* g) throw() : d_guts(g) {} ... };
std::max_align_t buffer1[512/sizeof(std::max_align_t)]; SimpleArena a1(buffer1, 512); typedef std::list<int, SimpleArenaAlloc<int>> InnerList; typedef std::scoped_allocator_adaptor<SimpleArenaAlloc<InnerList>> ScopedListAlloc; typedef std::list<InnerList, ScopedListAlloc> OuterList; // arenaから外部のlistをallocする OuterList *bigList = new(a1.alloc(sizeof(OuterList))) OuterList(ScopedListAlloc(&a1));
N2554 The Scoped Allocator Model (Rev 2)