allocator::rebind详解

xiaoxiao2021-03-01  20

rebind的本质应该这么说:给定了类型T的分配器Allocator=allocator<T>,现在想根据相同的策略得到另外一个类型U的分配器allocator<U>,那么allocator<U>=allocator<T>::Rebind<U>::other.

之所以要提供rebind接口,是因为容器只知道模板参数名Allocator,而不知其具体实现,容器只知道这样三个事情: 1、Alocator是T的分配器,但其内部实现策略是什么容器并不关心(可能是std::allocator<T>,也可能是myallocator<T>)。换句话说,容器并不知道allocator模板名。 2、类型T和类型U在逻辑上是相关的,比如在链表中,数据类型T和结点类型Node<T>是有联系的。 3、容器希望按照和T一样的策略(具体的说就是相同的allocator模板名)来分配U类型的对象。 这时rebind的作用就体现出来了,标准中规定 对一个allocator<T>,和一个类型U,必须有allotor<T>::rebind<U>::other=allocator<U>,这样, 容器就可以得到U的分配器, 也就是说,rebind的本质应该是:, 对allotor<T>::rebind<U>,T和U的分配器必须是同一个模板名。这个模板可以是std::allocator,也可以是用户自定义的分配器模板Myallocator,自然,为了使自己的分配器可以作为容器的模板参数,Myallocator中也必须定义rebind成员,且其实现必为 template<typename U> rebind{ typedef Myallocator<U> other; }; 因此,同族的分配器指的是具有相同模板名的一组分配器。 如std::allcoator<T>和std::allcoator<U>是同族的,你可以把std::allcoator<T>::rebind<U>::other看成std::allcoator<U>。 Myallocator<T>和Myallocator<U>是同族的,你可以把Myallcoator<T>::rebind<U>::other看成Myallcoator<U>。

但allcoator<T>和Myallocator<U>就不是同族的.

Alocator 是内存分配器,STL在这个层面上进行开放是为了让用户/程序员有权选择不同的内存分配器。举例来说,Allocator_A和Allocator_B在内存分配方式上可能是不一样的,也就是说Allocator_A<int>和Allocator_B<int>所分配的内存很有可能是不一样的。 假如有一个容器类MyVector, 它用的是Allocator_A<int>内存分配器,这个容器类很有可能需要double类型的分配器,而且要求对int和double类型的内存分配策略是一样的,这时rebind的意义就体现出来了。

总之一句话,rebind实现了对不同类型使用同一种内存分配策略的要求。

转自http://bbs.csdn.net/topics/200079053

转载请注明原文地址: https://www.6miu.com/read-4049994.html

最新回复(0)