如何为分层分配类使用分配器
假设我有一个std::vector<std::string>
。如何为分层分配类使用分配器
即使我为矢量指定自定义分配器,我的std::string
-s仍将使用标准字符串分配器。
我可以使用自定义分配器为容器和容器共享吗?
如果您有一个需要使用分层容器的分配器,标准库提供了一个解决方案: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的标准解决方案。
这并不意味着容器负责集装箱的分配,而是它们都共享相同的分配器。
对不起,但这篇文章大多是不正确的。多级容器分配是已知的问题,并且在标准库中有解决方案;你所建议的关注点分离并不是一个好的选择。请参阅:http://en.cppreference.com/w/cpp/memory/scoped_allocator_adaptor。 –
@NirFriedman,请问您可以添加一些关于此事的参考链接? –
我提供了一个到'scoped_allocator_adaptor'的链接。我认为这足够了? –
我觉得这个问题太广泛了。有3个单独的问题:如何使用分配器为简单的类,如何使用分配器为分层分配的类,以及如何编写分配器知道的容器。所有这三个都是很大的问题。如果你知道第一个答案,我会建议第二个和第三个单独的问题;如果你不知道第一个答案,那么你应该先阅读它(已经有很多答案)。 –
我想问题是“如何使用分配器的分层分配类”将考虑如何编辑。 – Nick