假设我有一个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方法。它尚未合并到标准中。它确实使事情变得更加简单,因为所有内容都经过类型擦除,并且我相信它会自动传递给嵌套容器。如果您使用google,可以在某处找到它的库实现。

10-08 08:28