2

malloc/free 操作のシーケンスが事前にわかっているアプリケーションがあります。最大メモリ使用量を最小限に抑えるために事前計算を行いたいと思います。それに関するリソースはありますか (c++ 実装/研究論文)?

より正確には、malloc/free 操作の同じシーケンスが何度も繰り返されます (各サイクルの最後にすべてが解放されます)。そのため、メモリ使用量を最適化するための計算を行う余裕があります。

4

2 に答える 2

0

達成したいことは、メモリの割り当てに費やされる時間を最小限に抑え、キャッシュの局所性を改善することであると仮定すると、これは実際には非常に単純に聞こえます。

メモリ マネージャを選択するだけです (メモリ マネージャを作成するか、Hoard などの既存のものを使用します)。次に、メモリ マネージャが、プログラムの開始時にサイクル中に使用されるメモリの最大量を割り当てます。

主な問題は、このメモリ量を計算することです。簡単な解決策は、現在のメモリ使用量と最大使用量を追跡するカウンタと一緒に malloc/free をラップする以外に何もしないアロケータを使用して 1 サイクルを実行することです。サイクルの終わりに、最初に割り当てるべき最大量です。

注意すべきことの 1 つは、割り当てられたメモリの断片化により、追加の割り当てが必要になる可能性があることです。これは通常、適切なメモリ マネージャーによって回避できます。最悪の場合、割り当てサイズごとに割り当てられた最大メモリを個別に追跡する必要がある場合があります。

補足として、C++ を使用している場合、new/delete の代わりに malloc/free を使用するのはなぜですか?

于 2013-05-05T07:32:47.397 に答える
0

より正確には、malloc/free 操作の同じシーケンスが何度も繰り返されます (各サイクルの最後にすべてが解放されます)。そのため、メモリ使用量を最適化するための計算を行う余裕があります。

メモリ使用量に関しては、これは解決するのが難しいケースではありません。同じメモリが同じ目的で再割り当てされるため、同じメモリの塊を何度も割り当てても、メモリが「無駄」になることはありません。

あなたが言っているのでmallocfree私たちはヒープの古いスタイルの「C」タイプの使用法について話しているのですか? では、心配するコンストラクタやデストラクタはありませんか? 次に、特定のタイプの要素の配列を作成しないのはなぜですか。

   struct X
   {
      ...
   };

古いコード:

   X* px[10];
   for(i = 0; i < 10; i++)
   {
      px[i] = malloc(sizeof(X));
      ...
   }

代わりに:

   X* px[10];
   X* xx = malloc(sizeof(X)*10);
   for(i = 0; i < 10; i++)
   {
      px[i] = &xx[i];
   }
于 2013-05-05T07:39:31.773 に答える