如何为std :: array中的std :: vector保留内存?

时间:2019-04-12 13:38:38

标签: c++ vector memory-management stl containers

我有一个std::array,其中numLines = 4的数字固定(std::vector);每个std::vector将包含动态数量的元素,我知道每个std::vectornumMaxSteps = 32)的最大大小。

因此:

std::array<std::vector<int>, numLines> mSequences;

由于我正在以更高的速率处理音频,因此它强制我从不在此过程中分配内存(因此,它会引入喀哒声和毛刺)。

但是我不确定如何在初始化时reserve来存储每个std::vector

有办法吗?还是我需要迭代std::array的每个项目并执行.reserve(numMaxSteps)

请注意,我需要将.size()保持为0:只有.capacity()需要长大。

4 个答案:

答案 0 :(得分:1)

如果不介意在访问向量时再写几个字母,也可以创建一个薄包装器:

   function createIndexFrame(dbObject,collectionName, callback)
   {
      dbObject.collection(collectionName).createIndex({frame:1},function(err, res) {
        if (err) throw err;
        callback();
    });
   }

答案 1 :(得分:1)

从您对马歇尔答案的评论中推断出来:

  

我只需要一种“奇特”的方式来保留init上的内存

没有比IILE更有趣的东西了

auto mSequences = []{
  std::array<std::vector<int>, nunLines> ret;
  for (auto& v : ret)
    v.reserve(maxCapacity);
  return ret;
}();

当初始化mSequences时,lambda将被自动调用,这要归功于NRVO的奇迹直接将其初始化。

它甚至可以用于初始化声明为const的复杂对象。

如果IILE的概念违反了您的编码标准,您总是可以使用它来创建一个命名的自由函数。

答案 2 :(得分:0)

  

有办法吗?还是我需要迭代std::array的每个项目并执行.reserve(numMaxSteps)

就是这样;-)

但是我同意@bartop;根据您的需要,您应该考虑使用array<array<int, 32>>

答案 3 :(得分:0)

您在这里描述的内容似乎是boost.static_vector的完美案例。

此容器允许您预分配编译时大小,但此后它支持push() / pop() / insert() / remove()等,它是{{1 }}函数和迭代器遵守实际运行时定义的大小。