自定义分配器使用相对地址

时间:2017-03-17 10:43:26

标签: c++ stl

如何在C ++标准容器中使用具有相对寻址的分配器?

template<class T>
class Allocator
{
  public:
     typedef uint32_t pointer;
     T& dereference(pointer x) noexcept
     {
         assert(is_valid(x));
         return *(base_ptr + x);
     }

  private:
     T* base_ptr;
     //...
};

动机:

  • 相对地址可以在不同的运行之间保持不变。保存数据时,只需将base_ptr转储到磁盘,并为空元素填充。为节省磁盘空间,gzip结果。
  • 在x86-64上,一些容器有很大的开销(考虑std::map<int,int>,其中每个节点需要额外的32字节,除非你将颜色位破解成其中一个指针的最低位,依赖于这样的事实:有4位始终为零)。使用相对地址,指针大小可以保持较小,因此开销较低。

在分配器的接口中没有指定自定义dereference方法。 std::pointer_traitspointer_to,但这是静态的,因此无法访问基指针。

0 个答案:

没有答案