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

6

ベクトルのサイズを予測し、ベクトル用に十分なメモリを事前に予約しておくと、メモリ使用量を削減するのに大いに役立つと思います。

占い師ではなく、エンジニアのように振る舞ってみてください。テストを作成し、違いを測定します。

于 2009-03-06T09:57:05.653 に答える
1

2つ目は、ループを介したすべての使用の最大メモリ、つまり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::vector<DataType> my_vector;
my_vector.resize(sizeof(yourData));
memcpy(reinterpret_cast<char*>(&my_vector), &yourData, sizeof(yourData));
于 2009-03-06T17:51:20.160 に答える
0

多くの追加を行う必要がある場合は、std::vector の代わりに std::deque を使用し、"push_back" を使用してください。

于 2009-03-06T10:17:12.093 に答える