有关自定义分配器的问题

时间:2015-06-11 12:31:10

标签: c++ templates stl allocator

我想创建自己的allocator类,我想知道一些事情:

  • 我必须定义以下类型:typedef size_t size_type;typedef ptrdiff_t difference_type;。我可以使用与size_t不同的内容吗?如果我想在使用uint32_t代替size_t的{​​{1}}的类中使用STL容器,我可以使用uint32_t,还是必须使用size_t }?如果我使用不同的类型,甚至签名类型,它会造成溢出或其他不愉快的事情吗?

  • 如何将参数传递给我的分配器?我是否必须向其添加带有参数的构造函数,并在将其传递给STL容器的构造函数之前手动构造它以与其一起使用?

对于下面定义的deallocate函数,我可以忽略要解除分配的项目数吗?

void deallocate( pointer p, size_type nNum )
{
   (void) nNum;
   delete[] p;
}
  • 什么是“重新绑定”的东西?

...

template< class U >
struct rebind
{
    typedef Allocator< U > other;
};

template< class U >
Allocator( const Allocator< U > & oAlloc )

谢谢。 :)

1 个答案:

答案 0 :(得分:2)

  1. 这是您的分配器,因此您可以使用所需的类型。 但是,请注意,如果您希望将它与STL容器一起使用,则必须使用STL容器所期望的类型。 这里$(window).scroll(function(){ if (condition){ $(this).off('scroll'); } }); 似乎合适。

  2. 您可以为分配器提供参数,就像它是普通类一样。 构造函数,初始化方法或setter很好。 实际上,您可以为分配器提供所需的所有功能,但您必须尊重分配,解除分配签名。

  3. 您可以忽略deallocate函数的大小。我看到很多标准的allocator实现没有使用这个参数。此信息有时可能很有用,例如,如果您的分配器根据大小切换到不同的分配策略,则此参数可能有助于在deallocate方法中启用良好的deallocate实现。