【问题标题】:Questions about custom allocators关于自定义分配器的问题
【发布时间】:2015-06-11 12:31:09
【问题描述】:

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

  • 我必须定义以下类型:typedef size_t size_type;typedef ptrdiff_t difference_type;。我可以使用不同于size_t 的东西吗?如果我想在一个使用 uint32_t 而不是 size_t 的类中使用 STL 容器,我可以使用 uint32_t 代替,还是必须是 size_t ?如果我使用不同的类型,甚至是带符号的类型,它会造成溢出或其他不愉快的事情吗?

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

对于下面定义的deallocate函数,我可以忽略要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 )

谢谢。 :)

【问题讨论】:

  • 你可以使用任何你喜欢的类型,毕竟这是你的代码。但是为什么不使用设计用于尺寸或差异的标准类型呢?请记住,差异可能是负数,因此您不能为其使用无符号数据类型。另请记住,如果您想将类与标准库一起使用,则必须满足特殊要求,这可能会限制您的类型选择。
  • 我想知道的不是我是否被允许这样做,而是是否可以安全地完成。
  • 使用uint32_t,您不能通过特征接口使用该分配器分配超过4096*sizeof(Object) MB 的内存,因为allocator_traits::allocate 使用分配器的size_type 作为其参数,即使您分配没有。

标签: c++ templates stl allocator


【解决方案1】:
  1. 这是你的分配器,所以你可以使用你想要的类型。 但是,请注意,如果您希望将它与 STL 容器一起使用,则必须使用 STL 容器所期望的类型。 size_t 在这里似乎很合适。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-10-30
    • 2012-07-23
    • 2011-05-25
    • 1970-01-01
    • 1970-01-01
    • 2011-04-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多