如何将分配器用于分层分配 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.
,您可以在某处找到它的库实现
假设我有一个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.