我如何使用 use std::allocator 代替 realloc?
How do I use use std::allocator in place of realloc?
假设我正在编写一个自定义向量,使用 std::allocator
来包装 new
和 delete
。
当元素的数量超过向量的容量时,我想将缓冲区重新分配给更大的东西。我可以通过调用 realloc()
轻松实现这一点。不过我不想这样做,因为我认为 allocation/deallocation 的责任应该属于分配器。
然而,查看 std::allocator
的界面,我不知道如何进行重新分配。只有以下方法:
T* allocate( std::size_t n );
void deallocate( T* p, std::size_t n );
我应该先调用 allocator::allocate
然后调用 allocator::deallocate
而不是只调用 realloc
?那有效率吗?这一定也是 std::vector
正在做的事情。为什么 std::allocator
不提供 reallocate
功能?
Let's say I'm writing a custom vector using the std::allocator to wrap new and delete.
在一般情况下(不包括 PODs 的专业化),我认为您无论如何都不能使用 realloc
。在特定内存位置构造的任意对象可能具有指向与其构造地址相关的非常特定地址的内部指针。简单地移动它(在字节复制意义上)可能会破坏不变量。
因此,您提到的替代方案通常是必要的。您将不得不分配一个新数组,move
(甚至可能 copy
!)将对象分配到新位置,然后释放旧数组。当然,这包括不止一个可能失败的阶段——在一般情况下你不能真正 reallocate
的另一个原因。也许这就是分配器在第一种情况下从未具有此功能的原因——对于基于数组的容器,您一般不能真正使用它们(尽管您可能能够将它们用于 POD 特化)。
假设我正在编写一个自定义向量,使用 std::allocator
来包装 new
和 delete
。
当元素的数量超过向量的容量时,我想将缓冲区重新分配给更大的东西。我可以通过调用 realloc()
轻松实现这一点。不过我不想这样做,因为我认为 allocation/deallocation 的责任应该属于分配器。
然而,查看 std::allocator
的界面,我不知道如何进行重新分配。只有以下方法:
T* allocate( std::size_t n );
void deallocate( T* p, std::size_t n );
我应该先调用 allocator::allocate
然后调用 allocator::deallocate
而不是只调用 realloc
?那有效率吗?这一定也是 std::vector
正在做的事情。为什么 std::allocator
不提供 reallocate
功能?
Let's say I'm writing a custom vector using the std::allocator to wrap new and delete.
在一般情况下(不包括 PODs 的专业化),我认为您无论如何都不能使用 realloc
。在特定内存位置构造的任意对象可能具有指向与其构造地址相关的非常特定地址的内部指针。简单地移动它(在字节复制意义上)可能会破坏不变量。
因此,您提到的替代方案通常是必要的。您将不得不分配一个新数组,move
(甚至可能 copy
!)将对象分配到新位置,然后释放旧数组。当然,这包括不止一个可能失败的阶段——在一般情况下你不能真正 reallocate
的另一个原因。也许这就是分配器在第一种情况下从未具有此功能的原因——对于基于数组的容器,您一般不能真正使用它们(尽管您可能能够将它们用于 POD 特化)。