type aware GC

D1.001がリリースされたこと知ってChangeLogを見に行くと、『New type aware GC』と書かれていました。
個人的には一番欲しかった機能がついにKITAっぽいです。

得た情報からの個人的な解釈では、

  • GCは型情報をチェックするようになった
    • アロケート(new)時に確保したメモリブロックに型情報を付加
    • それによってメモリアドレス以外をメモリアドレスとは解釈しなくなった
  • void[]型でアロケートすると保守的になる
    • 以前同様に全てメモリアドレスとして解釈する

なので、


struct Foo { ... };
Foo f;

p = new void[100];
f = cast(Foo)p; // ok
byte b = cast(byte)p;
f = cast(Foo)b; // ok, GC still regards memory as void

rather than:

p = new byte[100];
f = cast(Foo[])p; // will likely eventually corrupt memory


らしいです。
これによって

  • void[]でアロケートしたメモリ以外は明示的にdeleteしなくても大丈夫

という改善がされたと思っています。GCのスキャンスピードが速くなったのかは謎です。型チェックに必要な計算量と走査範囲の比の問題?

ポエニー

もっと早くにあればポエニーが途中あんなことにならずに……。
そういえば、byte[]でアロケートしている箇所が在ったようななかったような気がするので、今後のバージョンのコンパイラではまた動かなくなる可能性が高いです。