10

vectorを見て、ベクトルを作成するときに 2 番目の引数を使用したことがないことに気付きました。

std::vector<int> myInts; // this is what I usually do
std::vector<int, ???> myOtherInts; // but is there a second argument there?

上記のリンクを見ると、次の目的であると書かれています。

新しいアロケーター オブジェクトを作成する代わりに使用するアロケーター オブジェクト。

または、これに関しては:

アロケーター: ストレージ割り当てモデルの定義に使用されるアロケーター オブジェクトのタイプ。デフォルトでは、型 T のアロケータ クラス テンプレートが使用されます。これは、最も単純なメモリ割り当てモデルを定義し、値に依存しません。

メモリ管理と関係があると思います。ただし、それを使用する方法がわかりません。

これに関する指針はありますか?

4

5 に答える 5

4

デフォルトのアロケータ は、 (およびその他)std::allocator<>によって行われたすべての割り当てを処理します。std::vector<>新しい割り当てが必要になるたびに、ヒープから新しい割り当てが行われます。

カスタム アロケーターを提供することで、たとえば、メモリの大きなチャンクを前もって割り当ててから、それをスライスして、個別の割り当てが必要なときに小さな断片を渡すことができます。これにより、割り当て速度が劇的に向上します。これは、デフォルトのアロケーターと比較して複雑さが増すという犠牲を払って、ゲームなどに適しています。

一部のstd型の実装には、少量のデータ用のスタックベースの内部ストレージがあります。たとえば、std::basic_string<>いわゆる小さな文字列の最適化を使用する場合があります。この場合、 16 文字などの固定長よりも長い文字列のみ (単なる例です!) がアロケーターから割り当てられます。それ以外の場合は、内部配列が使用されます。

于 2010-12-14T08:11:11.767 に答える
2

カスタム アロケータは、一般的にはほとんど使用されません。それらが役立つ場所のいくつかの例:

  • 特定の割り当てパターンの最適化。たとえば、並行プログラムは、タスク実行の開始時に標準的な手段を介して大量のメモリ チャンクを事前に割り当て、グローバル ヒープ ミューテックスでブロックすることなく、その断片を削り取ることができます。タスクが完了すると、メモリ ブロック全体を破棄できます。この手法を STL コンテナーで使用するには、カスタム アロケーターを使用できます。

  • デバイスがさまざまなプロパティ (キャッシュ/非キャッシュ、高速/低速、揮発性/永続性など) を持つ複数の範囲のメモリを持つ組み込みソフトウェア。カスタム アロケーターを使用して、STL コンテナーに格納されているオブジェクトを特定のメモリ領域に配置できます。

于 2010-12-14T08:13:11.733 に答える
1

アロケーター (STL)は、ベクター クラスのオブジェクトのメモリを管理するのに役立ちます。異なるメモリ モデル (など) にカスタム アロケータを使用できます。

于 2010-12-14T08:12:04.317 に答える
1

多分これが役立つでしょう: http://www.codeguru.com/cpp/cpp/cpp_mfc/stl/article.php/c4079

stl allocatorでグーグルを試すことができます。

于 2010-12-14T08:08:20.917 に答える
0

こんにちは、カスタムアロケーターの例を見つけることができますhttp://www.codeproject.com/KB/cpp/allocator.aspx

于 2010-12-14T08:07:58.347 に答える