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

问题描述:

假设我有一个std::vector<std::string>如何为分层分配类使用分配器

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

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

+0

我觉得这个问题太广泛了。有3个单独的问题:如何使用分配器为简单的类,如何使用分配器为分层分配的类,以及如何编写分配器知道的容器。所有这三个都是很大的问题。如果你知道第一个答案,我会建议第二个和第三个单独的问题;如果你不知道第一个答案,那么你应该先阅读它(已经有很多答案)。 –

+1

我想问题是“如何使用分配器的分层分配类”将考虑如何编辑。 – Nick

如果您有一个需要使用分层容器的分配器,标准库提供了一个解决方案: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方法来分配器。它没有被合并到标准中。它确实使事情变得更简单一些,因为一切都被删除了,我相信它会自动传递给嵌套的容器。如果你是谷歌,你可以在某处找到它的库实现。

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

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

容器不能负责它所包含的对象所执行的任何分配,所以是的,你也必须使用std::basic_string以及自定义分配器。

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

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

scoped_allocator_adaptor

关于更新的问题,因为尼尔弗里德曼的回答表明,scoped_allocator_adaptor是使用相同的分配器的容器及其containees的标准解决方案。

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

+0

对不起,但这篇文章大多是不正确的。多级容器分配是已知的问题,并且在标准库中有解决方案;你所建议的关注点分离并不是一个好的选择。请参阅:http://en.cppreference.com/w/cpp/memory/scoped_allocator_adaptor。 –

+0

@NirFriedman,请问您可以添加一些关于此事的参考链接? –

+1

我提供了一个到'scoped_allocator_adaptor'的链接。我认为这足够了? –