内部実装について

GC

Xtalは参照カウンタとマークアンドスイープGCの併用となっており、GCを実行しなければメモリ使用量が閾値を超えない限りは、オブジェクトは一切回収されません。 そのため、毎ループxtal::gc関数を呼び出すことをお勧めします。gc関数はほとんど実行時間がか…

メモリ

Xtalはゲーム用途に使われることを想定しています。 ゲーム開発者の方々が気にすることの一つに「メモリはどこから確保されるのか」というのがあると思います。 昨今はメモリが増えたといっても、やはり断片化等で足りなくなる状況はありますので、気にする…

ポインタ -> 整数

Xtalの実装を見た人は、整数(int_t)からポインタへのキャストがあることを気にしてる人がいるかもしれません。 これは一応問題が無いということになってます。int_tの定義は次のようになっており、ポインタと同じ大きさの整数が自動的に選ばれ、int_tとしてt…

offsetof

offsetofを使うと、gcc3.3は警告を吐くんですが、これはどうするべきなんでしょうか。

一文字の文字列は必ずinternされるように

しました。 さらに、小さい文字列は変数に埋め込む形にしました。 struct BASE{ enum{ SMALL_STRING_MAX = (sizeof(int_t) / sizeof(char_t)) }; struct SmallString{ char_t buf[SMALL_STRING_MAX]; }; int_t type_; union{ int_t value_; float_t fvalue_;…

VMの命令を整理

Javaに倣って 「0をpushする命令」 「1をpushする命令」「2をpushする命令」「3を・・・」と、小さい整数用に特化した命令を用意してましたが、ばっさり消しました。 「1-byte整数をpushする命令」があれば、処理速度の低下は、これら小さいリテラルを多用する…

続 最適化

そもそもインスタンス変数へのアクセスが遅すぎるような気がしてきました。 いろいろ調べた結果、VC2005付属のSTLのvector::operatorが遅いんじゃないかという結論に達しました。vector::operatorは次のようになっています。 reference operator[](size_type…

実行効率の最適化を試みた

これまで、Xtalの仮想マシンはバイトコードで動いていました。 マシンがもっとも早く読み書きできるサイズの整数を使うワードコードとどっちにしようか迷ったのですが、メモリの節約とエンディアンの違いを考慮しなくてもいいという理由から、バイトコードで…

インスタンス変数

Xtalの仮想マシンの内部実装では、インスタンス変数へのアクセスは名前(文字列)ではなく、番号(整数)でアクセスする実装です。 Vec: class{ _x; // 0番目 _y; // 1番目 _z; // 2番目 _w; // 3番目 initialize: method(){ _x = 0; // 0番目のインスタンス変数…

型情報を値に埋め込む実装を追加

以前のエントリで言っていた型情報を値に埋め込む件を試してみました。 次のようなイメージの実装になっています。 enum Type{ TYPE_NULL = 0, TYPE_BASE = 1, TYPE_INT = 2, TYPE_FLOAT = 3, TYPE_MASK = (1<<1) | (1<<0), TYPE_SHIFT = 2 }; class Value{ …

浮動小数点数

Xtalは浮動小数点数の演算速度が、整数と変わらない実装になっています。Rubyでは整数に比べ、浮動小数点数の演算が遥かに遅くなっています。浮動小数点数は整数と違い、演算する度にFloatオブジェクトがアロケートされているからです。 ゲームでは浮動小数…