STL源码--空间配置器(一)

一、STL空间配置器allcator的主要接口

allocate

deallocate

construct

destroy

嵌套结构体:rebind

这里稍微解释一下rebind的作用,常见用法如下,allocator<int>::rebind<char>::other;

rebind主要是为了实现不同类型采用同样的内存分派的策略。

例如:先看vector的分配器是allocator<T>,你要多少T就给你他就给你多少个T的对象。和new出来的一样。
再看看list的分配器,同样也是allocator<T>,但是了解 链表 这个数据结构的都知道一个node应该是
template<T>
struct node
{
   T data;
   node* prev;
   node* next;
};
所以allocator<T>就无法分配出一个node对象,而仅仅是T对象,象vector的那样。
尽管list的allocator<T>和vector的allocator<T>是一样,但是list还是有其他的办法,它在内部由allocator<T>来获取适合它自己的分配器。
allocator<T>::rebind<node<T> >::other,这个other就是allocator<node<T> >
list就用这个other来分配内存了。

这时候对list和vector都只需要传递allocator<T>的内存分配器就行。当然对list你也可以直接传递,allocator<node<T> >作为内存分配器。

二、样例代码

1: pointer allocate(size_type cnt, CHxAllocator<void>::const_pointer pHint = 0)
   2: {
   3:     UNREFERENCED_PARAMETER(pHint);
   4:  
   5:     if (cnt <= 0)
   6:     {
   7:         return 0 ;
   8:     }
   9:  
  10:     void* pMem = nullptr ;
  11:     if (max_size() < cnt || (pMem = malloc(cnt * sizeof(value_type))) == NULL)
  12:     {
  13:         throw std::bad_alloc(0);
  14:     }
  15:  
  16:     return static_cast <pointer>(pMem);
  17: }
  18:  
  19: void deallocate(pointer p, size_type)
  20: {
  21:     free(p);
  22: }
  23:  
  24: void construct(pointer p, const_reference val)
  25: {
  26:     :: new ((void *)p) T(val);
  27: }
  28:  
  29: void destroy(pointer p)
  30: {
  31:     p->~T();
  32: }
原文地址:https://www.cnblogs.com/cane/p/3828782.html