バリシュ:
あなたの質問は非常に一般的ですが、私の答え/ガイダンスは次のとおりです。
ゲーム エンジンについてはわかりませんが、組み込みおよびリアルタイム アプリケーションの場合、割り当てアルゴリズムの一般的な目標は次のとおりです。
1- 限られた実行時間: 最悪の場合の割り当て時間を事前に知っておく必要があるため、それに応じてリアルタイム タスクを計画できます。
2- 高速実行: 明らかに、高速であるほど良い
3- 常に割り当てる: 特にリアルタイムのセキュリティ クリティカルなアプリケーションの場合、すべての要求を満たす必要があります。メモリ空間を要求してヌル ポインタを取得した場合: トラブル!
4- 断片化を減らす: 使用するアルゴリズムにもよりますが、一般的に、キャッシュ効果などのさまざまな理由により、断片化の少ない割り当ての方がパフォーマンスが向上します。
ほとんどの重要なシステムでは、最初から動的にメモリを割り当てることはできません。要件を分析して最大メモリ使用量を決定し、アプリケーションが起動したらすぐに大量のメモリを割り当てます。できない場合、アプリケーションは起動さえしません。起動した場合、実行中に新しいメモリ ブロックは割り当てられません。
速度が問題になる場合は、同様のアプローチに従うことをお勧めします。メモリを管理するメモリ プールを実装できます。プールは、アプリケーションの開始時に「十分な」メモリ ブロックを初期化し、このブロックからメモリ要求を処理できます。より多くのメモリが必要な場合、プールは (より多くのメモリ要求を見越して) 別の (おそらく大規模な) 割り当てを行うことができ、アプリケーションはこの新しく割り当てられたメモリの使用を開始できます。さまざまなメモリ プール スキームもあり、これらのプールを管理することは別の全体的なトピックです。
いくつかの例について: VxWorks RTOS は、アルゴリズムがリンクされたリストを分析して十分な大きさの空きブロックを見つける最初適合の割り当てアルゴリズムを採用していました。VxWorks 6 では、ベスト フィット アルゴリズムを使用しています。このアルゴリズムでは、空き領域がツリーに保持され、割り当てがツリーを横断して十分な大きさの空きブロックを探します。Zoltan Laszlo によるというタイトルのホワイト ペーパーがありMemory Allocation in VxWorks 6.0
、Google で検索すると、詳細が記載されています。
速度/断片化に関する質問に戻ります。実際には、アプリケーションによって異なります。考慮すべき事項は次のとおりです。
独自のアロケーターを実装しようとしているためにこの質問をしている場合は、おそらく、基礎となる割り当て/割り当て解除アルゴリズムを変更できるように設計する必要があります。アプリケーションでは、さまざまなアロケーターを試してみたいと思うでしょう。あなたの要件を知らずに何かを推奨する場合は、全体的な特性が優れているため、TLSF から始めます。