我正在研究动态语言的运行时库,更具体地说是它的内存分配。
我将使用垃圾收集,但我认为如果需要允许用户使用自己的内存分配器会很好。但是,在查看了标准的 c++ 分配器接口之后,我没有看到任何拥有通用分配器的方法(除了在 char 上进行模板化,但它看起来很笨拙)。
- 使用标准分配器接口是个好主意吗?
- 如果是,分配多种类型的可能设计是什么?
注意:我的库使用 C++11,所以我说的是“新”分配器接口。
我正在研究动态语言的运行时库,更具体地说是它的内存分配。
我将使用垃圾收集,但我认为如果需要允许用户使用自己的内存分配器会很好。但是,在查看了标准的 c++ 分配器接口之后,我没有看到任何拥有通用分配器的方法(除了在 char 上进行模板化,但它看起来很笨拙)。
注意:我的库使用 C++11,所以我说的是“新”分配器接口。
正如@Cubbi 所说,看看allocator::rebind
. 分配器的实际类型参数几乎无关紧要。标准容器用于allocator::rebind
更改为它们实际需要的类型。特别是,关联容器需要分配节点来保存自己的数据以及容器名义上保存的数据对象。Soallocator::rebind
用于allocator<Node<T>>
从allocator<T>
.
取决于您是否需要编译时或运行时多态性。标准分配器适用于前一种情况。对于后者,您可以执行以下操作:
class Allocator {
public:
virtual void* allocate(std::size_t size) = 0;
virtual void deallocate(void* p) = 0;
}
用户将能够通过虚拟功能自定义分配器。