我刚学习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?**
答案 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())
分配器,并初始化它以使用char
,vector<int>
中的分配器。
答案 1 :(得分:0)
这些行
IntAlloc::rebind<char>::other::pointer pszC =
IntAlloc::rebind<char>::other(v1.get_allocator()).allocate(1, (void *)0);
将使用v1
(std::vector<int>
)使用的相同分配器来分配一个char
(如果可能,在地址0x0
附近)
但是std :: vector使用的分配器实际上只知道如何分配和构建int
,而不是char
,所以你必须重新绑定&#34;分配器的类型为char
分配器(然后你使用静态方法allocate,并且隐式转换 [构造char
分配器]你的{{1分配器int
到)v1.get_allocator()
分配器
这样,如果您的分配器实际上是从已分配的内存池中提供内存块(例如),则可以为不同类型重用相同的池。