2013-10-22 8 views
5

予約/再ハッシュ関数は、要素(キー、vlaue)のペアのメモリではなく、挿入された。C++ unordered_mapには、事前に知られている最大サイズの場合に要素のメモリを事前に割り当てる方法があります。

要素のメモリもあらかじめ割り当てることができるので、低遅延のアプリケーションでは動的メモリ割り当てに時間を費やす必要はありません。

+0

マップのサイズとなるバケットサイズとバケット数を設定できます。 – aaronman

+0

コンストラクタに副作用のある型を使用して 'reserve'をテストしました。実際にはキーや値のためにメモリを予約していないように見えます。 http://ideone.com/yH746X –

+0

@ polkovnikov.ph私はそれがバケットのためのスペースをキーと値ではなく予約することに同意します – Medicine

答えて

2

1つの可能性は、独自のアロケータを書くことです。これは、テーブルに入る可能性のあるアイテムの数(少なくともすべてのスペースを事前に割り当てることができるようにする)と、アイテムのスペースを再利用することについて気にしない場合、少なくとも効果的です彼らはテーブルから取り除かれます(あなたの簿記は簡単です)。

このような場合、基本的にN個のオブジェクトにスペースを事前に割り当てることができ、割り当てられる次のアイテムの位置を追跡することができます。オブジェクトを割り当てることは単にアドレスを返してポインタを増やすことから成ります。return *next++;

もちろん、これは本当に動的割り当てを排除するものではありません。これ以上(テンプレートパラメータとして提供されているので、インラインで展開される可能性が高いので、プロセス内で関数呼び出しのオーバーヘッドが発生しないようにしてください)

固定サイズのオブジェクト用の汎用アロケータは、通常、可変サイズのオブジェクトの場合よりも(少なくとも幾分)高速ですが、それでも動的割り当ては削除されませんが、速度を十分に向上させてかなり働くあなたの目的のために少し良い。

関連する問題