【问题标题】:How does std::vector::reserve actually work?std::vector::reserve 实际上是如何工作的?
【发布时间】:2021-05-17 02:01:54
【问题描述】:

我了解.reserve() 为向量保留内存,但实际上并未修改其大小。但是这是如何实现的呢?你怎么能只保留内存而不分配它?

编辑:我特别问的是如何在不分配内存的情况下保留内存,而不是std::vector 的一般工作原理

【问题讨论】:

  • 这能回答你的问题吗? How does c++ std::vector work?
  • @OrangeDog 我专门询问如何保留内存,因为我知道动态内存分配的工作原理。感谢您的建议
  • @OrangeDog 实际上,我找到了对您链接的问题的回复 (stackoverflow.com/a/3167551/13647419),这涉及到保留内存的主题,但仍然没有太大意义。该内存是否已使用?
  • 它确实描述了reserve 的工作原理。它分配内存。
  • 是的,我被解释为 reserve 实际上分配了内存,所以我也会仔细看看你发送的答案,因为我误解了

标签: c++ c++11 vector dynamic-memory-allocation stdvector


【解决方案1】:

向量的大小是它所包含的元素的数量。向量的 容量 是它在不分配额外内存的情况下可以容纳的元素数量。 reserve 可以通过重新分配和复制元素来增加容量。这会增加容量,但不会改变大小。

【讨论】:

    【解决方案2】:

    你误解了一件主要的事情: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

    【讨论】:

      【解决方案3】:

      vector::reserve 确实分配了内存,因此您关于保留内存而不分配的问题是不正确的。关键是可以在不改变向量大小的情况下保留内存。基本上一个向量有两种大小,它的大小和容量。 reserve 分配内存并更改容量,但不更改大小。

      在任何给定时间,0 &lt;= size &lt;= capacity 都是正确的。容量反映了分配的内存量,大小反映了该内存中构造元素的数量。

      【讨论】:

      • 哦……不过据我了解,保留的内存还是可以用不同的方式使用的吧?
      • @H-005 不,这不是真的(至少矢量不是真的)。​​
      • @H-005 可以在保留的内存中构造新元素,但向量仍然“拥有”所有内存。没有办法重复使用或借用额外的容量。
      猜你喜欢
      • 2020-09-22
      • 1970-01-01
      • 2015-01-04
      • 2013-06-18
      • 1970-01-01
      • 2010-12-17
      • 2011-03-11
      相关资源
      最近更新 更多