読者です 読者をやめる 読者になる 読者になる

C++0x Scoped Allocator Model

C++

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)

C++0x言語拡張まとめ