关于自定义分配器的问题
Questions about custom allocators
我想创建自己的分配器 class,但我想知道一些事情:
我必须定义以下类型:typedef size_t size_type;
和typedef ptrdiff_t difference_type;
。我可以使用不同于 size_t
的东西吗?如果我想在使用 uint32_t
代替 size_t
的 class 中使用 STL 容器,我可以使用 uint32_t
代替,还是必须size_t
?如果我使用不同的类型,甚至签名类型,它会产生溢出或其他不愉快的事情吗?
如何将参数传递给我的分配器?我是否必须向它添加一个带有参数的构造函数,并在将其传递给 STL 容器的构造函数以与它一起使用之前手动构造它?
对于下面定义的函数 deallocate,我可以忽略要解除分配的项数吗?
void deallocate( pointer p, size_type nNum )
{
(void) nNum;
delete[] p;
}
- "rebinding" 的内容是什么?
..
template< class U >
struct rebind
{
typedef Allocator< U > other;
};
template< class U >
Allocator( const Allocator< U > & oAlloc )
谢谢。 :)
这是你的分配器,所以你可以使用你想要的类型。
但是,请注意,如果您希望将它与 STL 容器一起使用,则必须使用 STL 容器期望的类型。
size_t
在这里似乎很合适。
您可以向您的分配器提供参数,就好像它是一个普通的 class。
构造函数、初始化方法或设置器都可以。
事实上,您可以为您的分配器提供所有您想要的功能,但您必须遵守分配、解除分配签名。
您可以忽略解除分配函数的大小。我看到很多没有使用这个参数的标准分配器实现。此信息有时可能很有用,例如,如果您的分配器根据大小切换到不同的分配策略,则此参数可能有助于 deallocate 方法打开良好的 deallocate 实现。
我想创建自己的分配器 class,但我想知道一些事情:
我必须定义以下类型:
typedef size_t size_type;
和typedef ptrdiff_t difference_type;
。我可以使用不同于size_t
的东西吗?如果我想在使用uint32_t
代替size_t
的 class 中使用 STL 容器,我可以使用uint32_t
代替,还是必须size_t
?如果我使用不同的类型,甚至签名类型,它会产生溢出或其他不愉快的事情吗?如何将参数传递给我的分配器?我是否必须向它添加一个带有参数的构造函数,并在将其传递给 STL 容器的构造函数以与它一起使用之前手动构造它?
对于下面定义的函数 deallocate,我可以忽略要解除分配的项数吗?
void deallocate( pointer p, size_type nNum )
{
(void) nNum;
delete[] p;
}
- "rebinding" 的内容是什么?
..
template< class U >
struct rebind
{
typedef Allocator< U > other;
};
template< class U >
Allocator( const Allocator< U > & oAlloc )
谢谢。 :)
这是你的分配器,所以你可以使用你想要的类型。 但是,请注意,如果您希望将它与 STL 容器一起使用,则必须使用 STL 容器期望的类型。
size_t
在这里似乎很合适。您可以向您的分配器提供参数,就好像它是一个普通的 class。 构造函数、初始化方法或设置器都可以。 事实上,您可以为您的分配器提供所有您想要的功能,但您必须遵守分配、解除分配签名。
您可以忽略解除分配函数的大小。我看到很多没有使用这个参数的标准分配器实现。此信息有时可能很有用,例如,如果您的分配器根据大小切换到不同的分配策略,则此参数可能有助于 deallocate 方法打开良好的 deallocate 实现。