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
分享到:
相关推荐
The Slab Allocator An Object-Caching Kernel Memory Allocator
该库可以通过提供类似于标准ID3D12Device::CreateCommittedResource功能Allocator::CreateResource来帮助开发人员管理内存分配和资源创建。 在内部: 分配并跟踪更大的内存堆,其中的已使用和未使用范围
Dynamic-Memory-Allocator:动态内存分配器,使用最合适的位置和显式空闲列表
buddy_allocator buddy system memory allocator from Linux kernel System Storage 两个大小相等且邻接的内存块被称作伙伴。 如果两个伙伴都是空闲的,会将其合并成一个更大的内存块,作为下一层次上某个内存块的...
mmap_allocator mmap内存的基本分配器此时,您可以创建mmap共享内存(create_shared_memory),并使用分配器(mmap_alloc)通过仅传递mmap起始指针和大小来分配任何种类的东西。 使用mmap_free可以释放所有变量。 ...
gpu-allocator = " 0.6.0 " 设置Vulkan的分配器 use ash :: version :: {DeviceV1_0, EntryV1_0, InstanceV1_0}; use ash :: vk; let mut allocator = VulkanAllocator :: new ( & VulkanAllocatorCreateDesc { ...
内存分配器 基于显式空闲列表的自定义内存分配器 有几种常用的实现自定义内存分配器的方法,例如隐式空闲列表,显式空闲列表,隔离的空闲列表和平衡的二进制搜索树,每种方法各有优缺点。 在这里,我使用显式的空闲...
嵌入式 C++ 伙伴分配器 大卫·B·罗宾斯 ... Robins。 在修改后的(3 条)BSD 许可下发布。 首次发布 2015-01-23。 概述 这是一个用 C++ (C++11) 编写的用于嵌入式环境的。... 它最初用于 ARM 软件,并使用 GCC 4.8 和 ...
HostPort Allocator旨在通过像对待持久卷一样对待主机端口来解决此问题。 要使用一个主机端口HostPortClaim和HostPort必须创建,该HostPort将被从分配的端口HostPortClass 。 一旦分配了Pod ,便可以通过注释引用...
git clone https://github.com/fernandabonetti/Allocator.git 安装体育馆环境 pip install -e AllocatorGym 用法 根据您的自定义值,根据.env.example创建一个.env文件。 使用python3 main.py执行代理 培训日志存储...
TerraFX.Interop.D3D12MemoryAllocator D3D12MemoryAllocator的互操作绑定。 程序包位于: : 或通过NuGet Feed URL: : 目录行为守则TerraFX和所有提供帮助的人员(包括问题,拉取请求,Wiki等)必须遵守 。 可通过...
内存分配器 C 中的简单和伙伴内存分配器。
该文档描述了jemalloc的数据结构及其实现
API 记录基本用法 var myAllocator = require('my-allocator')();myAllocator.HelloWorld({ hello: 'world' }, function(err, result) { console.log(result);});典型用法1. 初始化 myAllocator var options = { ...
座位分配器 该程序是Java类的JavaFx GUI分配。 项目名称 座位分配器 项目工期 2018年6月30日-2018年7月1日(2天) 框架和语言 Java + JavaFx 用法 用户可以… ...单击“添加学生”按钮,为带有所选颜色的学生分配座位 ...
cs371p-分配器cs371p 的分配器项目
房间分配器 一个将房间分配给室友的应用程序 房间分配器: 该应用程序可将公寓中的房间分配给其居住者。 这是一个完全没有偏见的应用程序。 相信我 :)
好友分配器 用C ++编写的简单伙伴分配器。
名称 使用最坏拟合算法的动态内存分配器 概要 void *calloc(size_t nmemb, size_t size); void *malloc(size_t size); 空自由(空*ptr); void *realloc(void *ptr, size_t size); 描述 malloc() 分配 size 字节并...
qiscus多聊天定制代理分配器 初始说明