2010-10-31 52 views
2

这池创建的std ::地图分配器是stl allocator, copy constructor of other type, rebind如何使用对象

后随我使用的std ::地图,并希望自定义分配器,可以重新用于内部节点的存储。正在存储的项目是指针,所以我不是在讨论重用它们,而仅仅是地图的内部分配。

的主要要求是,地图上的不同实例不能共享一个对象池,它必须是每个实例是唯一的。

我并不需要一个完整的解决方案,我只是想如何与所需的拷贝构造函数不同类型的分配器应付的想法。在这种情况下,我不知道如何管理内部存储器。

+0

也许您在寻找[intrusive containers](http://www.boost.org/doc/libs/1_44_0/doc/html/intrusive.html)。 – GManNickG 2010-10-31 10:41:10

回答

2

当您在其他问题指出,该分配器不应该有任何的状态。使用线程本地存储或每个分配器对象中的指针指向内存池:分配器仅仅成为该池的特定于类型的接口。

struct MemoryPool { 
    // none of this depends on the type of objects being allocated 
}; 

template<class T> 
struct MyAllocator { 
    template<class U> struct rebind { typedef MyAllocator<U> other; }; 

    MemoryPool *_pool; // copied to any allocator constructed 

    template<class U> 
    MyAllocator(MyAllocator const &other) : _pool(other._pool) {} 

    // allocate, deallocate use _pool 
    // construct, destruct deal with T 
}; 
+0

不幸的是,池被用于线程组,而不仅仅是一个线程。 – 2010-10-31 10:09:25

+0

@edA:然后池的方法应该是线程安全的。如果*每个* map都应该使用不同的池,则使其成为分配器的数据成员,该分配器在复制分配器时不会被复制。这破坏了一些STL的要求,但是如果你仔细的话可以使用,或者你必须使用不同的容器类。 (性病::地图是不是很难写。)然后 – 2010-10-31 10:11:23

+0

该池是基于原始内存,水平不高的对象。这可能会使我受益一点,但我不确定。我希望避免写自己的地图,但是当我看到这种限制时,它可能是不可避免的。 – 2010-10-31 10:31:23

相关问题