2017-10-20 20 views
0

私は、C++ 11のstd :: allocatorの要件を実装し、正常に動作する実行方法として書いたプールアロケータを使用しましたが、 (以下の論文に基づいて)を基準として:固定サイズのチャンクプールアロケータを特定のSTLコンテナに適用する

https://pdfs.semanticscholar.org/4321/a91d635d023ab25a743c698be219edcdb1a3.pdf

は、本当に良い時間でそれに十分な大きさのメモリの1つのブロックに単一のオブジェクトを割り当てるためのものです。

std :: allocatorテンプレートメソッド "allocate"には、STLコンテナが同時に割り当てるブロックの数を要求できるパラメータがあります。たとえば、std :: basic_stringのように見えますが、スタック上に保持されている特定のサイズの文字列を超えると、アロケータから連続したメモリブロックを要求することによって、char配列を格納するのに十分な大きさのメモリを一度にヒープに移動します文字列全体を保持します。 std :: vectorの動的拡張も同様の方法で動作するようです。

このタイプのSTLコンテナにテンプレート化されている型のサイズを固定サイズのチャンクを返すように設計したアロケータを適用する方法はありますか?

+2

標準アロケータは、テンプレート化された型の指定された数のアイテムに対して連続した記憶域を割り当てることができる必要があります。 –

+1

あなたは(オプションの)メンバ 'size_type max_size()'を提供でき、違反時にスローします – Caleth

答えて

1

あなたはこのルートダウンして行くことができる:

On the other hand, multiple instances of numerous fixed-sized 
pools can be used to produce a general overall flexible 
general solution to work in place of the current system 
memory manager. 

を、実際に*カウントがオブジェクトである新しいプールの要求、すなわちあなたの「オブジェクトサイズ」としてそれぞれ異なるサイズの要求を処理します。 多くのRAMを焼き付けます。 配列サイズの上限を設定し、その上にデフォルトの汎用割り当てに戻すことができます。

+0

私の実装は、allocators内にallocatorを置くことができる、つまりN個のメモリプールstd :: basic_stringのような文字の配列を保持するのに十分な大きさの連続した記憶領域ブロックを割り当てます。残念ながら、std :: basic_stringはchar型の配列へのポインタではなく、文字型にテンプレートを割り当てることを期待しています。そのため、ブロックサイズが連続した記憶域を返すように実装を変更する方法を考えなければなりません基本型にテンプレート化された場合 – Bitrex

+1

allocate関数に2番目のパラメータを追加します。これは単位数です。 –

関連する問題