1

私はいくつかのグラフィックプログラミングを行っており、頂点プールを使用しています。プールから範囲を割り当てて、これを描画に使用できるようにしたいと思います。

必要なソリューションとCアロケータの違いは、mallocとは呼ばないことです。代わりに、配列を事前に割り当ててから、それをラップして空き領域を追跡し、渡した割り当てから範囲(開始/終了ポインターのペア)を割り当てるオブジェクトが必要です。

どうもありがとう。

4

3 に答える 3

2

一般的に:あなたは(ウィキペディアを参照)メモリプール(TokenMacGuyによって答えられたboost :: poolのような)を使用するメモリマンガを探しています。彼らは多くの味があります。重要な考慮事項:

  • ブロックサイズ(固定または可変、異なるブロックサイズの数、ブロックサイズの使用量を(統計的に)予測できますか?
  • 効率(一部のマネージャーは2 ^ nのブロックサイズを持っています。つまり、最適なブロックを検索するネットワークスタックで使用します。非常に優れたパフォーマンスであり、メモリを浪費することを犠牲にして断片化はありません)
  • 管理オーバーヘッド(非常に小さなブロックが多数あると思います。したがって、メモリマネージャーによって維持されるintとポインターの数は効率にとって重要です)

boost :: poolの場合、単純な分離ストレージは一見の価値があると思います。これにより、最適なものが検索される多くの異なるブロックサイズでメモリプールを構成できます。

于 2009-08-07T07:00:10.237 に答える
1

boost :: poolはこれを非常にうまく行います!

于 2009-08-07T06:40:26.033 に答える
0

代わりに、配列を事前に割り当ててから、それをラップして空き領域を追跡し、渡した割り当てから範囲(開始/終了ポインターのペア)を割り当てるオブジェクトが必要です。

これは基本的にmalloc()が内部で行うことです(malloc()は、いっぱいになると、この「事前に割り当てられた配列」のサイズを増やすことができます)。そうです、そのためのアルゴリズムがあります。実際、多くのことがあり、ウィキペディアは基本的な概要を示しています。さまざまな戦略がさまざまな状況でうまく機能する可能性があります。(たとえば、すべてのブロックが同じサイズである場合、または割り当てと解放に何らかのパターンがある場合)

同じサイズのオブジェクトが多数ある場合は、obstacksを調べてください。

おそらく自分でコードを書きたくないでしょう。それは簡単な作業ではなく、バグは苦痛を伴う可能性があります。

于 2009-08-15T12:59:49.447 に答える