株式会社空想科学テクノロジー

YamatoMM( Yamato Memory Manager )

*C++ のランタイム。オブジェクトの寿命を管理し、回収とコンパクションを行います。

YamatoMM は、何をするものか

YamatoMM は、*C++ のランタイムです。*C++ で書いたオブジェクトの寿命を管理します。 プログラマーが newdelete を対応させる代わりに、 仕組みで寿命を管理します。

何を持つかリストです。いま何が使われていて、それがどこにあるか。ここが曖昧だと、ブロックを動かせません。
何をするか回収と、コンパクションです。使われなくなったブロックを返し、空いた隙間を詰めます。返すだけでは、隙間は残ります。ゲーム機やスマートフォン、組み込みの機器は使えるメモリの量が決まっていますので、合計は足りていても大きなブロックが確保できません。コンパクションすると、同じメモリでより多くのオブジェクトを置けます。
いつ動くか処理の周期ごとに、少しずつ進めます(= ゲームならゲームループの中で)。画面の切り替わりや通信の待ちなど、まとめて止めてよい瞬間に呼ぶこともできます。
どれだけ止まるかプログラマーが決めた時間に収めます。時間で管理しますので、止まる長さで移す数が決まります。

止まる時間の上限と、足りなくなったときの振る舞いは、プログラマーが決めます(= 取り扱い方法)。

RAII を受け継いでいます

C++ の RAII は、オブジェクトがスコープを抜けるとき、資源をその場で返します。 RAII より良い考え方を、私たちも知りません。YamatoMM も、RAII を受け継いでいます。

ただし、RAII が解消しないものが 2 つあります。 共有された所有(= shared_ptr)で互いに参照し合ったものは、スコープを抜けても指す先が残ります。返したあとの隙間も、詰まりません。 YamatoMM は、この 2 つを引き受けます。循環参照を回収し、隙間を詰めます。

※ RAII は「Resource Acquisition Is Initialization」の略で、「資源の確保は、初期化である」と訳されます。オブジェクトを作った時点で資源を持ち、そのオブジェクトが消える時点で返します。返す処理はプログラマーが呼ばず、オブジェクトの寿命に括り付けます。

リストがあるから、できる検査があります

*C++ の安全の検査は 5 つです(= null・境界・ゼロクリア・型・競合)。4 つは実行時の検査で、不正な操作はその瞬間にその場所で止まります。ゼロクリアは止める検査ではなく、起きなくする初期化です。 null・境界・型は、その場での比較です。 残る 2 つは、YamatoMM がメモリとリストを持っているからできる検査です。

ゼロクリア確保のたびに、領域は全て 0 で埋めます。未初期化のフィールドを読むことは、ゼロクリアを効かせた姿では起きません(= 局所変数も同じです)。
競合の検出排他の印(= ロック)で囲んでいない所からのアクセスを見つけたら、実行を停止します。Java や C# にも無い検査です。最も重い検査のため、リリースモードでは外せます。

5 つの検査の全体と、テストモードでは全部効かせてリリースモードで外す形は、安全性 のページに書きました。