如何将分配器用于分层分配 class

How to use an allocator for a hierarchically allocated class

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

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

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

Suppose I have std::vector of std::string. How can I use custom allocator for it? I can do allocator for the vector, but then I need to do for strings as well?

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

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

Suppose I have own class, similar to linked list of std::string. How can I use custom allocator for it? Shall I do my own implementation or say replace malloc with xmalloc etc.

同样,容器不应该 responsible/aware 由其容器执行的分配!相反,将 std::basic_string 与自定义分配器一起使用。

scoped_allocator_adaptor

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

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

如果你有一个分配器,你想与分层容器一起使用,标准库提供了一个解决方案: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 方法。它尚未合并到标准中。它确实让事情变得更简单了,因为一切都被类型擦除,我相信它会自动传递给嵌套的容器。如果 google.

,您可以在某处找到它的库实现