【发布时间】: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