有关自定义分配器的问题

Questions about custom allocators

本文关键字:问题 分配器 自定义      更新时间:2023-10-16

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

  • 我必须定义以下类型:typedef size_t size_type;typedef ptrdiff_t difference_type;。我可以使用与size_t不同的东西吗?如果我想在使用 uint32_t 表示长度和位置而不是 size_t 的类中使用 STL 容器,我可以改用uint32_t,还是必须size_t?如果我使用其他类型,甚至是签名类型,它会产生溢出或其他不愉快的事情吗?

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

对于下面定义的函数 delease,我可以忽略要释放的项目数吗?

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. 这是您的分配器,因此您可以使用所需的类型。但是,请注意,如果您希望将其与 STL 容器一起使用,则必须使用 STL 容器期望的类型。 size_t在这里似乎很合适。

  2. 您可以向分配器提供参数,就像它是普通类一样。构造函数、初始化方法或资源库都可以。事实上,你可以向分配器提供你想要的所有功能,但你必须尊重分配、释放签名。

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