nlib
nn::nlib::heap 名前空間

heapライブラリの名前空間です。nmalloc(), nfree()等はグローバル名前空間に定義されています。 [詳解]

クラス

class  CachedHeap
 CentralHeapと対になって利用されるスレッド専用キャッシュクラスです。 [詳解]
 
class  CentralHeap
 CachedHeapと対になって利用される中央ヒープクラスです。nmalloc()の実装に利用されています。 [詳解]
 
class  FrameHeap
 ヒープの両端からメモリを確保することができます。 [詳解]
 
class  StackHeap
 スタックに積み上げるようにメモリを確保していくアロケータです。 [詳解]
 
class  UnitHeap
 固定メモリサイズの領域を確保・解放するためのヒープです。所謂プールアロケータです。 [詳解]
 

詳解

heapライブラリの名前空間です。nmalloc(), nfree()等はグローバル名前空間に定義されています。

nmalloc(), nfree() について

nmalloc(), nfree()は以下のような特長を備えています。
  • 多段のフリーリストを備えていて、実際の利用時での速度低下が抑えられています。
  • 小さいサイズのメモリの確保・解放を効率的に行うことができます。
    • スレッド毎にメモリをキャッシュすることで、メモリの確保と解放を高速化しています。
    • メモリサイズ毎に領域をまとめることでフラグメンテーションを緩和しています。
    • ヘッダ情報のオーバーヘッドが削減されていて、スペース効率が改善されています。
    • 異なるコアが同一キャッシュラインにアクセスするリスクを低減させる仕組みが実装されています。
  • double freeの検出、free後の書き込みの検出、及びヒープ内メタデータの書き換え等に対するチェック機能を備えています。
    • free後にメモリ領域がフリーリストに繋がれる際にポインタがマングルされ不正利用が行いにくくなっています。
  • nmalloc_aligned()を利用することでalignされた領域を確保可能です。
  • nrealloc()は十分効率的に動作するreallocの実装です。
  • nmalloc_heaphash()を利用することでヒープ全体の状況のハッシュを簡単に取ることができます。
  • nmalloc_walk_allocated_ptrs()を利用することで、nmalloc()されたポインタを順番に訪れることができます。リークしたメモリを強制的に解放する等の応用が可能です。
  • NMALLOC_HEAPOPTION_CHECK_1オプションを指定することで、nmallocされた各メモリに対して16bitの値を2つ付加できるようになります。
    • メモリアロケーションの分類等に利用できます。
    • 速度的なオーバーヘッドは十分に抑えられています。

CentralHeap, CachedHeap について

nmalloc(), nfree()は、nn::nlib::heap::CentralHeap, nn::nlib::heap::CachedHeapを用いて実装されています。 nmalloc(), nfree()に対応するCentralHeapはプロセスに1つ、CachedHeapはスレッドに1つで、プロセス内のコードはこれを共有する形になりますが、プログラマは直接これらのオブジェクトを別途作成し、自らヒープを作成してメモリの確保・解放を行うこともできます。

その他のヒープについて

特殊な用途のためのヒープがいくつか用意されています。
これらのヒープは高速化のため利用されることを意図していますが、全く汎用的ではありません。 例えば複数スレッドからの利用を行うためには、メモリの確保と解放処理をそれぞれロックする必要があります。CachedHeapを使えばそのようなロックは必要ない場合があります。 また、プログラムの作成当初はシングルスレッド専用のメモリのつもりで利用していても、確保したメモリの所有権を他のスレッドに渡す必要が出てくるかもしれません。 そのため、CentralHeap, CachedHeapを利用した方が却って高速であるという場合があることに注意してください。
heap/nmalloc_simple/nmalloc_simple.cpp サンプルも御覧ください。