合法使用STL分配器:Scott Meyers

时间:2017-12-08 14:35:02

标签: c++ stl effective-c++

我正在阅读Scott Meyers的有效STL,而第11项下面有关于分配器的文本。

分配器的实用程序,假设您有两个堆,由Heap1和Heap2类标识。每个堆类都有用于执行分配和释放的静态成员函数:

class Heap1 {
public:
…
static void* alloc(size_t numBytes, const void *memoryBlockToBeNear); static void dealloc(void *ptr);
…
};
class Heap2 { ... }; // has the same alloc/dealloc interface

进一步假设您想要将不同堆中的某些STL容器的内容放在一起。再说一遍,没问题。首先,编写一个分配器,设计为使用Heap1和Heap2等类进行实际的内存管理

template<typenameT, typename Heap>
SpecificHeapAllocator {
public:
pointer allocate(size_type numObjects, const void *localityHint = 0)
{
return static_cast<pointer> (Heap::alloc(numObjects * sizeof(T),
localityHint));
}
void deallocate(pointer ptrToMemory, size_type numObjects)
{
Heap::dealloc(ptrToMemory);
}
…
};

然后使用SpecialHeapAllocator将容器的元素聚合在一起:

vector<int, SpecificHeapAIlocator<int, Heap1 > > v; // put both v's and set<int, SpecificHeapAllocator<int Heap1 > > s; //s's elements in
//Heap1
list< Widget,
SpecificHeapAllocator<Widget, Heap2> > L; // put both L's and
map< int, string, less<int>, // m's elements in
SpecificHeapAllocator<pair<const int, string>, // Heap2
                                       Heap2> > m;

在这个例子中,Heap1和Heap2是类型而不是对象是非常重要的。 STL提供了一种语法,用于使用相同类型的不同分配器对象初始化不同的STL容器,但我不打算向您展示它是什么。那是因为如果Heap1和Heap2是对象而不是类型,它们将是不相等的分配器,这将违反分配器上的等价约束。

我上面的问题是

  1. “使用相同类型的不同分配器对象初始化不同的STL容器”的STL语法是什么?

  2. 为什么Heap1和Heap2是对象,它们是不相等的分配器?

0 个答案:

没有答案