std::list如何分配节点和元素

13
< p > std::list 如何分配用于保存 next/prev 指针和包含的 T 元素的节点?

我认为标准分配器只能用于为一种类型分配内存(因为 std::allocator::allocate 按照 sizeof(T) 的增量分配内存)。因此,似乎不可能在单个分配中分配列表节点和包含的对象,这意味着节点必须由实现决定的任何内容进行分配,并且节点存储指向对象的指针而不是对象本身,这意味着需要两个间接级别才能从指向列表节点的指针到达其包含的对象,这似乎效率低下。这是正确的吗?


д»Җд№Ҳйҳ»жӯўдҪ жӢҘжңүдёҖдёӘж—ўжңүжҢҮй’ҲеҸҲжңүTжҲҗе‘ҳзҡ„иҠӮзӮ№з»“жһ„пјҹ - Quentin
@Quentin,因为std::list使用的分配器的模板参数是与列表存储相同类型的,而不是一个node结构。这就是我提出问题的原因。 - asdf
哦,我现在明白了。好问题。 - Quentin
1个回答

9
分配器有一个成员模板类rebind,负责分配其他类型。这里std::allocator的页面实际上有一个你正在询问的确切示例。我在这里引用它:
在C++11之前 std::list<T, A>分配某些内部类型Node<T>的节点,使用分配器A::rebind<Node<T>>::other 自C++11以来 std::list<T, A>分配某些内部类型Node<T>的节点,使用分配器std::allocator_traits<A>::rebind_alloc<Node<T>>,如果A是std::allocator,则它是基于A::rebind<Node<T>>::other实现的。

哇,我在提问之前应该更仔细地阅读那个页面。谢谢。 - asdf
1
这意味着给 list 分配器分配的那个,用于分配 T 的分配器从未被使用,是吗? - asdf
@asdf:这取决于实现。但就我所知,在最明显的实现情况下,那是正确的。 - Benjamin Lindley
std::allocator页面表示在C++17中已弃用rebind,在C++20中已删除,那么最新版本如何工作? - e271p314
https://dev59.com/I1kT5IYBdhLWcg3wefQn - e271p314

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接