要使用 boost::object_pool 实现映射的自定义分配器,如何使用 boost::object_pool 分
To use boost::object_pool to implement custom allocator for map, How to allocate n continuous elements using boost::object_pool?
我想为std::map
指定allocator
。所以编写自定义代码,从这里获取 Josuttis 的基本代码。我想使用boost::object_pool
来获得高性能。但是boost::object_pool
没有提供接口功能所需的n
连续元素来分配
pointer allocate (size_type num, const void* = 0)
的allocator
.
如何在boost::objet_pool
中分配n个连续元素?任何其他开源对象池都提供相同的功能。
我看到boost::simple_segregated_storage
有界面
void * malloc_n(size_type n, size_type partition_sz);
但
void free_n(void * chunks, size_type n,size_type partition_sz);
需要分配元素的大小,我认为这不容易用作对象池。
下面的答案是纯粹的黑客,使用boost::object_pool
来实现std::map
的自定义allocator
。需要在平台上测试解决方案(特定版本的操作系统,编译器,boost和c ++ std lib组合(。
似乎std::map
,从不请求多个元素的连续内存,因此您可以实现分配器的 API pointer allocate (size_type num, const void* = 0)
来仅分配单个元素,即key-value
对,因为num
总是 1。
我检查了插入多个元素的情况,复制地图的构造函数,通过一次调用将多个元素插入地图,以使用begin iterator
和end iterator
另一个地图传递元素范围map::insert
。
在 RHEL7、boost 1.57.0、gcc 版本 4.8.2 20140120(红帽 4.8.2-16(上进行了测试
- C++Boost Asio Pool线程,带有lambda函数和传递引用变量
- 当覆盖存在时调用基本虚拟"binded to object"函数
- "Unable to start debugging. No process is associated with this object." - 在Visual Studio Code中使用GDB
- 为什么使用Pool和Bool而不是int8_t或char
- C++将派生类转换为基类时'object slicing'期间发生的情况
- 如何理解 C++17 标准参考中的 [intro.object]/3? N4659 的
- C++ - Thread Pool
- "Cannot convert Python object argument to type '<typename>'" - 使用 Cython 包装 C++ 类时出错
- 使用 object 中的方法调用带有 std::bind 和 std::function.target 的 C 样式函数
- "Called Object Type is Not a Function or Pointer" 与 typedef 和类
- C++线程"Call to non-static member function without an object argument"
- dopen():不以 root 身份运行时"failed to map segment from shared object"
- 当两个成员位于同一类中时出错"a nonstatic member reference must be relative to a specific object"
- Nan::ObjectWrap to Napi::Object Wrap 无法访问 JavaScript 中的属性
- 现代C++会支持 C# "Object Initalizer"语法吗?
- 指向对象生存期之外的已分配内存的指针是"invalid pointer[s]"还是"pointer[s] to an object"?
- C++ Equivalent of Java Map<String, Object>
- Thread Pool C++
- WebKit2GTK+ "window-object-cleared"未清除
- 返回 *&object 时是否允许复制/移动省略?