std::vector::reserve 实际上是如何工作的?

问题描述

我知道 sampler 为向量保留内存,而没有实际修改其大小。但这是如何实施的?你怎么能只保留内存而不分配它?

编辑:我专门询问如何在不分配内存的情况下保留内存,而不是关于 .reserve() 一般如何工作

解决方法

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 可以通过重新分配和复制元素来增加容量。这会增加容量但不会改变大小。