我对std :: vector有疑问。

我有一个内存非常密集的算法,我预测到预测矢量大小并预先为矢量保留足够的内存将有助于减少内存使用量。

以下哪项更好:

for ( ... ) {
  std::vector<Type> my_vector;
  my_vector.reserve(stuff_count);
  // Do stuff , and append stuff to my_vector.
}

或者这个:

std::vector my_vector;
for ( ... ) {
  my_vector.clear();
  my_vector.reserve(stuff_count);
  // Do stuff , and append stuff to my_vector.
}

请告诉我哪个是最好的,或者是否有更好的做事方式。

非常感谢你!

有帮助吗?

解决方案

使用第一个变体,您可以在每次迭代时重新分配向量的缓冲区&#8211;这通常是非常昂贵的。使用第二个变体,您只需偶尔重新分配。第二种变体更好,因为速度是你的首要任务。

您不清楚问题中元素数量的来源。也许你甚至可以快速计算所有迭代的最大元素数,将其设置为缓冲区大小并且没有重新分配。

其他提示

  

我预见到预测矢量大小并提前为矢量保留足够的内存将有助于减少内存使用量。

尝试并且像工程师一样行事,而不是算命先生。创建一个测试,并测量差异。

第二个可能会稍快一些,但我发现第一个更干净。

由于代码中的差异微不足道,为什么不测试这两种方法并查看哪种方法最适合您的特定应用?

我想说,这取决于Type需要如何构建/破坏。如果它是一个不需要破坏的POD,你可以跳过clear(),它调用循环中的所有析构函数,并将其用作静态数组:

std::vector<Type> my_vector(size);
for (...)
{
  int index = 0;
  // Do stuff
  my_vector[index] = some_value;
}

(警告:代码未经测试)

  

...为...保留足够的记忆   提前的矢量会对我有所帮助   减少内存使用

错误......什么?!这毫无意义。保留内存无助于以任何方式减少内存使用。它可以防止需要不断重新分配,这会使事情变得更快,但就使用而言,你没有任何好处。

第二个将通过循环使用它的所有使用的最大内存,即stuff_count类型的最大大小。 std :: vector :: clear()不一定释放内存。即,如果在 std :: vector :: clear()之前和之后调用 std :: vector :: capacity(),标准符合实现可以返回相同的值。

充其量,您将减少使用上述方案分配内存的次数。但你肯定不会在任何时候减少内存占用。如果你想缩小到保留的内存量,你应该使用vector swap idiom:

std::vector<type>().swap(my_vector);
my_vector.reserve(stuff_count); 

或者您的第一个解决方案,因为整体效果将是相同的。

如果你需要做很多追加,可以使用std :: deque而不是std :: vector,只需使用“push_back”。

怎么样?

std::vector<DataType> my_vector;
my_vector.resize(sizeof(yourData));
memcpy(reinterpret_cast<char*>(&my_vector), &yourData, sizeof(yourData));
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top