解析allocator :: rebind调用

时间:2015-07-30 17:04:54

标签: c++ memory memory-management

我刚学习C ++分配器,我试图了解每个分配器中struct rebind的用途。例如,在this program中:

#include <memory>
#include <iostream>
#include <algorithm>
#include <vector>

using namespace std;

typedef vector<int>::allocator_type IntAlloc;
int main( ) 
{
   IntAlloc v1Iter;
   vector<int> v1;

   //************What's going on here?********
   IntAlloc::rebind<char>::other::pointer pszC =
      IntAlloc::rebind<char>::other(v1.get_allocator()).allocate(1, (void *)0);

   int * pInt = v1Iter.allocate(10);
}

我想了解关键线的作用。它是否将typedef IntAlloc现在修改为char vector的分配器?即使我猜对了,我也不确定我能否打破它。这是我的猜测:

IntAlloc::rebind<char> //accessing the struct rebind

`::other` //accessing data member other inside rebind

(v1.get_allocator()) //**isn't this just retrieving IntAlloc in its original form?** 
///What is this for?

.allocate(1, (void *)0); //**this is allocating something? What do these parameters mean?**

2 个答案:

答案 0 :(得分:0)

不幸的是,这是所有预先C ++ 11分配器的工作,它们大大简化了2011年的标准。

struct rebind本质上是一种解决语言中没有模板化typedef这一事实的方法,Container不需要分配相同类型在内部作为传递它们的分配器。他们&#34;重新绑定&#34;分配器并返回一个可以分配不同类型的新分配器(例如,&#39; std :: set&#39; s分配一些&#39; Node&#39;类型,其中包含指向树的其他节点的指针结构,除了分配器分配的类型的对象之外)。这种机制隐藏了内部结构,但肯定不是很好。

例如,您可能有一个Allocator<int>,但要创建树结构,std::set需要从类型为Allocator<std::_Node<int>>的对象或类似的东西进行分配。 rebind机制允许这样做。

  

(v1.get_allocator())// 这不仅仅是以原始形式检索IntAlloc吗?

这是从[{1}}获取分配器对象,类型为v1,所以或多或少是。

vector<int>::allocator_type正在获取IntAlloc::rebind<char>::other(v1.get_allocator())分配器,并初始化它以使用charvector<int>中的分配器。

答案 1 :(得分:0)

这些行

IntAlloc::rebind<char>::other::pointer pszC =
      IntAlloc::rebind<char>::other(v1.get_allocator()).allocate(1, (void *)0);

将使用v1std::vector<int>)使用的相同分配器来分配一个char(如果可能,在地址0x0附近) 但是std :: vector使用的分配器实际上只知道如何分配和构建int,而不是char,所以你必须重新绑定&#34;分配器的类型为char分配器(然后你使用静态方法allocate,并且隐式转换 [构造char分配器]你的{{1分配器int v1.get_allocator()分配器

这样,如果您的分配器实际上是从已分配的内存池中提供内存块(例如),则可以为不同类型重用相同的池。

有关详细信息,请参阅thisthis