7

地形エンジン (DirectX を使用) に問題があります。

詳細ブロックの頂点を保持するためにベクトルを使用しています。ブロックが詳細に増加すると、ベクトルも増加します。

ただし、ブロックのディテールが減少しても、ベクトルのサイズは縮小しません。

それで、私の質問: ベクトルのサイズを縮小する方法はありますか? 私はこれを試しました:

vertexvector.reserve(16);
4

4 に答える 4

27

ベクトルから要素をポップしても、メモリは解放されません (コンテナ要素へのイテレータが無効になるため)。ベクターを新しいベクターにコピーして、元のベクターと入れ替えることができます。これにより、スペースが無駄になりません。スワップは、スワップされたベクトルの要素への反復子を無効にしてはならないため、スワップには一定の時間の複雑さがあります。したがって、内部バッファーポインターを交換するだけで済みます。

vector<vertex>(a).swap(a);

これは「Shrink-to-fit」イディオムとして知られています。ちなみに、次の C++ バージョンには、std::vector の「shrink_to_fit()」メンバ関数が含まれています。

于 2009-02-25T16:12:52.143 に答える
8

通常のトリックは、空のベクターと交換することです。

vector<vertex>(vertexvector.begin(), vertexvector.end()).swap(vertexvector);
于 2009-02-25T16:11:30.570 に答える
6

ベクトルサイズを小さくしても、一般的にパフォーマンスが向上するため、予約済みメモリは減少しません。ベクトルによって予約されているメモリの量を減らすことは、ベクトルのサイズを予約されたサイズを超えて増やすことと同じくらい費用がかかります。

  1. アロケータに新しい、より小さなメモリの場所を尋ねます。
  2. 古い場所からコンテンツをコピーし、
  3. 古いメモリ位置を解放するようにアロケータに指示します。

場合によっては、アロケータは割り当てのサイズをその場で変更できますが、それが保証されるわけではありません。

必要なサイズに非常に大きな変更があり、そのベクトルを再び拡張したくないことがわかっている場合(ローカリティのプリンシパルはそうすることを提案しますが、もちろん例外があります)、litbの提案を使用できますベクトルを明示的に縮小するスワップ操作:

vector<vertex>(a).swap(a);
于 2009-02-25T16:16:40.667 に答える