2

いっぱいになるまでメモリのチャンクを別の連続メモリ領域に追加するための既知のヘッダーのみの STL のようなコンテナー/アロケーターはありますか? 現時点std::vector<char> vecでは、便利なインターフェイスがあるため、を使用していますが、最適ではなく、どういうわけか自分のニーズに合わせて悪用していると思います。

最初std::vector::reserveにその容量を修正し、不要な再割り当てを避けるために必要なメモリを一度だけstd::copy(&chunk[0], &chunk[size], vec.data() + vec.size())割り当ててから、そのたびに新しいメモリ チャンクをunfilledベクターの背後のメモリ領域に追加します (もちろんsize() <= capacity())。各コピーの後、それに応じてベクトルのサイズを明示的に更新します。わかりました、back_inserter を使用できます。しかし、これは今のポイントではありません (以下を参照)。

もちろん、最後に呼び出すことができるように、どの実装でstd::copyも特殊化できますが、これは保証ではありません。そのような保証を得るために、ベクトルによって既に割り当てられているメモリにチャンクを追加するために自分で呼び出すことは、ただ醜いです。より良い/よりエレガントなオプションはありますか?charmemcpymemcpy

編集:メモリのチャンクがどのように割り当てられるかを制御できません。それらが与えられます。

4

3 に答える 3

0

基本的に、連続したメモリ領域にメモリを「実際に」追加する唯一の方法は、Posix 関数を使用することrealloc()です。使用できるこれらの割り当てられた地域でも、std::copy地域の最終位置に関する知識を維持するだけで済みます。

ただし、realloc()メモリ領域が以前のメモリ位置にあることを保証するものではなく、新しいブロックが完全に連続していることを保証します。詳細については、 manページを参照してください。

覚えておくべきいくつかのこと:

  • 経由でメモリを割り当てた場合posix_memalign()、メモリの配置が維持されることは保証されません
  • realloc()データがコピーされたかどうかを確認する方法はありません。
于 2013-01-25T10:25:36.633 に答える
0

これはおそらくあなたが探しているものではありません。それらは同種のコンテナ (つまり、すべての要素が同じ型を持つ) 用に設計されているからです。それがあなたのユースケースに合っているかどうかはわかりません。役に立つと思われる場合は、次のことをお勧めします。

get_temporary_buffer-- raw ストレージを割り当てます (ストレージを返す方法もあります)。

raw_storage_iterator-- raw ストレージに対するイテレータを出力します。

uninitialized_copy_n-- いくつかのオブジェクトを raw ストレージにコピーします (単一要素バージョンもあります)。

于 2013-01-26T00:20:50.960 に答える
0

私はそれがあなたが望むものではないことを知っていますが、std::dequeは通常、メモリの連続したブロックをつなぎ合わせます。

成長しても再割り当てはありませんが、データ全体が連続していない可能性があります。

編集

事前に割り当てられたメモリを使用すると、最後に値vectorを指定できます。新しい値によってサイズが容量を超えない限り、再割り当ては発生しません。insert

vector<char> values(PRE_ALLOCATED_SIZE);
// ...
values.insert(values.end(), chunk, chunk+CHUNK_SIZE);
于 2013-01-25T11:09:57.370 に答える