5

我对 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.
}

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

非常感谢您!

4

9 回答 9

11

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

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

于 2009-03-06T09:23:28.353 回答
6

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

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

于 2009-03-06T09:57:05.653 回答
5

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

于 2009-03-06T09:23:27.713 回答
5

由于代码中的差异很小,为什么不测试这两种方法,看看哪种方法最适合您的特定应用程序?

于 2009-03-06T09:30:09.320 回答
1

我会说,这在一定程度上取决于 Type 需要如何构造/销毁。如果是不需要销毁的 POD,则可以跳过 clear(),它在循环中调用所有的析构函数,而将其用作静态数组:

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

(警告:代码未经测试)

于 2009-03-06T09:45:19.237 回答
1

...提前为向量保留足够的内存对减少内存使用有很大帮助

呃……什么?!这根本没有意义。保留内存无助于以任何方式减少内存使用量。它避免了不断重新分配的需要,这使事情变得更快,但就使用而言,您没有任何好处。

于 2009-03-06T09:46:08.457 回答
1

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

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

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

或者你的第一个解决方案,因为整体效果是一样的。

于 2009-03-10T15:56:15.350 回答
0

如果你需要做很多附加使用 std::deque 而不是 std::vector 并且只使用“push_back”。

于 2009-03-06T10:17:12.093 回答
0

怎么样?

std::vector<DataType> my_vector;
my_vector.resize(sizeof(yourData));
memcpy(reinterpret_cast<char*>(&my_vector), &yourData, sizeof(yourData));
于 2009-03-06T17:51:20.160 回答