std :: vector resize(0)或clear() - 但保持它的容量

时间:2017-03-16 17:41:00

标签: c++ c++11 vector

我正在将许多对象合并到包含渲染数据(网格)的单个向量中。这个向量被清除并重新填充每个帧(好吧,差不多)。

问题是,清除然后再保留向量大小对我的性能有很大的影响,因为clear()也可能会改变容量。

换句话说,我需要控制向量的容量何时发生变化。我想保留旧容量很长一段时间,直到我决定自己是时候改变它了。

我看到两个选项:

  • 弄清楚如何控制std :: vector的容量即将改变的时间
  • 为大内存对象实现一个内存池,它将获取< =所需大小的大型数据对象,并在需要时重用/释放它

更新

此外,如果调用调整大小(10),然后调用调整大小(5)(仅用于说明,将实际数字乘以数百万),该怎么办?

稍后调用resize(5)会导致向量重新分配吗?

2 个答案:

答案 0 :(得分:9)

实际上clear成员函数保持向量容量不变。它只会破坏(调用析构函数)每个向量元素,并将向量大小设置为0。

在这种情况下,在每次迭代时,我会调用clear()来销毁所有向量元素,然后调用成员函数reserve(size),在向量容量太小的情况下,它将会将其增加到至少size

答案 1 :(得分:2)

  

这个矢量被清除并重新填充每一帧(好吧,差不多)。

我会推荐一种不同的方法。

创建一个充当渲染数据缓冲区的类。

如果我没弄错的话,你永远不会减少缓冲区的容量。您只需在需要时增加容量。

确保该类是实现细节,并且只构造实例。

这是我正在思考的骨架实现。

namespace Impl_Detail
{
   struct Buffer
   {
      size_t capacity;
      size_t size;
      std::vector<char> data;

      // Pick whatever default capacity makes sense for your need.
      Buffer(size_t cap = 100) : capacity_(cap), size_(0), data(cap) {}

      void ensureCapacity(size_t cap)
      {
         if ( capacity_ < cap )
         {
            capacity_ = cap;
            data.resize(capacity_);
         }
      }


      // Add any other helpful member functions as needed.
   };

   // Create an instance and use it in the implementation.
   Buffer theBuffer;
}