gpt4 book ai didi

c++ - 如何为分层分配的类使用分配器

转载 作者:行者123 更新时间:2023-11-30 01:38:58 26 4
gpt4 key购买 nike

假设我有一个 std::vector<std::string> .

即使我为 vector 指定了自定义分配器,我的 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 方法。它尚未合并到标准中。它确实让事情变得更简单了,因为一切都被类型删除,我相信它会自动传递给嵌套的容器。如果你用谷歌搜索,你可以在某处找到它的库实现。

关于c++ - 如何为分层分配的类使用分配器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46771591/

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