gpt4 book ai didi

c++ - 使用两个模板参数创建最简单的分配器

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:46:37 24 4
gpt4 key购买 nike

我是 C++ 内存管理的新手,但我想亲力亲为地构建一个简单的分配器,该分配器可以为某些容器提前预分配足够的内存。

我看过 Alexandrescu Loki 图书馆并尝试阅读一些博客,但所有这些对我来说都很难理解。我想从一些原始的、可行的起点开始,扩展它,看看它是如何演变的。这是我现在所拥有的以及我所理解的(我的起点):

template <class T>
struct Allocator {

Allocator(){};

template <class U>
Allocator(Allocator<U> const&);

T* allocate(size_t s) {
return static_cast<T*>(::operator new(s * sizeof(T)));
}

void deallocate(T* p, size_t s) {
::operator delete(p);
}

void construct(T* p, T const& val) {
::new((void *)p) T(val);
}

void destroy(T* p) {
return ((T *) p)->~T();
}

using value_type = T;

};

所以,我现在可以像这样使用它了:

std::vector<int, Allocator<int> > vec;

这个分配器非常简单,我明白它的作用。我现在想稍微扩展一下,以便我的客户端代码如下所示:

std::vector<int, Allocator<int, 8> > vec;

我现在希望我的代码能够为 8 个元素分配足够的内存。我试图用这些行扩展我的起始代码:

template <class T, size_t T_num_els>
struct Allocator {

template <class U, size_t U_num_els>
Allocator(Allocator<U, U_num_els> const&);

... I keep all the rest without changes just for testing reason

但是当我编译它时,我得到了一个疯狂的错误消息列表,一些消息告诉我们需要替换、rebind_alloc 和没有名为“type”的类型。那么,我该如何解决它。我应该对我的垫脚石代码进行哪些更正以允许我的分配器有两个模板参数?

最佳答案

我认为问题在于您有一个非类型模板参数。 allocator_traits adaptor似乎不支持这一点。

一些容器,比如 std::list<int> , 不会分配 int但有些 internal_node<int> .所以它必须能够转换 Allocator<int>进入 Allocator<internal_node<int>> .

要为这样的类型 T 创建一个分配器,allocator_traits希望能够做到Alloc::rebind<T>::other来自原始 (C++98) 分配器接口(interface),或使用 Alloc<T, Args...>当你的分配器是 Alloc<U, Args...> .

这两个选项都不符合您可以使用 Allocator 完成的操作.最后一个失败是因为值 8不是可以匹配 Args 的类型.

可能你可以通过添加

来解决这个问题
template<class U>
struct rebind
{
using other = Allocator<U, T_num_els>;
};

关于c++ - 使用两个模板参数创建最简单的分配器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48061522/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com