std::vector::reserve 是如何运作的?
How does std::vector::reserve actually work?
我了解 .reserve()
为矢量保留内存,但实际上并未修改其大小。但这是如何实施的呢?你怎么能只保留内存而不分配它?
编辑: 我特别询问如何在不分配内存的情况下保留内存,而不是 std::vector
通常如何工作
vector::reserve
确实分配内存,所以你关于保留内存而不分配的问题是不正确的。关键是可以在不改变向量大小的情况下保留内存。基本上一个向量有两个大小,它的大小和它的容量。 reserve
分配内存并更改容量,但不更改大小。
在任何给定时间,以下内容都是正确的 0 <= size <= capacity
。容量反映了分配的内存量,大小反映了内存中构造元素的数量。
你误解了一件主要的事情:std::vector::reserve
实际上是在分配内存。
假设我们创建了一个自定义 Allocator
,例如:
template <typename T>
struct Allocator
{
using value_type = T;
Allocator() = default;
T* allocate( std::size_t N )
{
N *= sizeof( T );
std::cout << "Allocation " << N << " bytes" << std::endl;
return static_cast< T* >( ::operator new( N ) );
}
void deallocate( T *ptr, std::size_t N )
{
std::cout << "Deallocation " << (N * sizeof * ptr) << " bytes" << std::endl;
::operator delete( ptr );
}
};
如果你这样使用它:
int main()
{
std::vector< int, Allocator< int > > v;
v.reserve( 100 );
}
输出将是:
Allocation 400 bytes
Deallocation 400 bytes
你可以玩它here。
向量的大小是它包含的元素的数量。向量的容量是它在不分配额外内存的情况下可以容纳的元素数量。 reserve
可以通过重新分配和复制元素来增加容量。这会增加容量但不会改变大小。
我了解 .reserve()
为矢量保留内存,但实际上并未修改其大小。但这是如何实施的呢?你怎么能只保留内存而不分配它?
编辑: 我特别询问如何在不分配内存的情况下保留内存,而不是 std::vector
通常如何工作
vector::reserve
确实分配内存,所以你关于保留内存而不分配的问题是不正确的。关键是可以在不改变向量大小的情况下保留内存。基本上一个向量有两个大小,它的大小和它的容量。 reserve
分配内存并更改容量,但不更改大小。
在任何给定时间,以下内容都是正确的 0 <= size <= capacity
。容量反映了分配的内存量,大小反映了内存中构造元素的数量。
你误解了一件主要的事情:std::vector::reserve
实际上是在分配内存。
假设我们创建了一个自定义 Allocator
,例如:
template <typename T>
struct Allocator
{
using value_type = T;
Allocator() = default;
T* allocate( std::size_t N )
{
N *= sizeof( T );
std::cout << "Allocation " << N << " bytes" << std::endl;
return static_cast< T* >( ::operator new( N ) );
}
void deallocate( T *ptr, std::size_t N )
{
std::cout << "Deallocation " << (N * sizeof * ptr) << " bytes" << std::endl;
::operator delete( ptr );
}
};
如果你这样使用它:
int main()
{
std::vector< int, Allocator< int > > v;
v.reserve( 100 );
}
输出将是:
Allocation 400 bytes
Deallocation 400 bytes
你可以玩它here。
向量的大小是它包含的元素的数量。向量的容量是它在不分配额外内存的情况下可以容纳的元素数量。 reserve
可以通过重新分配和复制元素来增加容量。这会增加容量但不会改变大小。