如何为分层分配的类使用分配器

时间:2017-10-16 13:30:54

标签: c++ allocator

假设我有Book

即使我为向量指定了自定义分配器,我的std::vector<std::string> - s仍将使用标准字符串分配器。

我可以使用自定义分配器为容器和容器共享吗?

2 个答案:

答案 0 :(得分:2)

  

假设我有std :: vector的std :: string。我该如何使用自定义分配器?我可以为向量做allocator,但是我还需要为字符串做?

当您为容器使用自定义分配器时,您可以命令容器使用分配器分配内存。

容器不能对其包含的对象执行的任何分配负责,所以是的,您还必须将std::basic_string与自定义分配器一起使用。

  

假设我有自己的类,类似于std :: string的链表。我该如何使用自定义分配器?我应该自己实现还是用xmalloc等替换malloc。

同样,容器不应该负责/意识到其容器执行的分配!相反,请将std::basic_string与自定义分配器一起使用。

<强> scoped_allocator_adaptor

关于更新的问题,正如Nir Friedman的回答所示,scoped_allocator_adaptor是对容器及其容器使用相同分配器的标准解决方案。

这并不意味着容器负责容器的分配,而是它们共享相同的分配器。

答案 1 :(得分:2)

如果您有一个要与分层容器一起使用的分配器,标准库提供了一个解决方案:scoped_allocator_adaptor。当您使用适配器时,它会强制将分配器向下传递给任何可识别分配器的容器。这要求容器正确地专门化分配器感知特征,并且其所有构造函数都具有最后占用分配器的重载。以下是http://en.cppreference.com/w/cpp/memory/scoped_allocator_adaptor的使用示例:

namespace bi = boost::interprocess;
template<class T> using alloc = bi::adaptive_pool<T,
                                    bi::managed_shared_memory::segment_manager>;
using ipc_row = std::vector<int, alloc<int>>;
using ipc_matrix = std::vector<ipc_row, std::scoped_allocator_adaptor<alloc<ipc_row>>>;

需要注意的一点是,分配器当然是容器类型的一部分。所以这并不能让你不需要为内部容器指定正确的分配器类型。这样做是确保分配器实例传递下来。这对于非无状态的分配器很重要。示例继续:

bi::managed_shared_memory s(bi::create_only, "Demo", 65536);

// create vector of vectors in shared memory
ipc_matrix v(s.get_segment_manager());

正如你可能得到的那样,这个分配器不是无状态的。

如果你有一个无状态分配器,你不需要处理任何这个,你只需要定义外部和内部容器的类型来使用相同的分配器,那就是。

我不会在这里进入它,但另一种方法是使用新的pmr方法来分配器。它还没有合并到标准中。它确实使事情变得更简单,因为一切都是类型擦除的,我相信它会自动传递给嵌套容器。如果你谷歌,你可以在某处找到它的库实现。