週末の予習

今週末、第1回 RHGの逆襲に参加してこようと思います。

今回の範囲は、第2章 オブジェクトみたいなので、簡単に予習をしておりました。

で、簡単に見た限り(といっても、正直オブジェクトの構造体あたりは自身がありません)、この章において、1.8と1.9で違いがみられたのが、RObject構造体と、インスタンス変数まわり。

// 1.8.6 ruby.h 
321 struct RObject {
322     struct RBasic basic;
323     struct st_table *iv_tbl;
324 };

// 1.9.0 include/ruby/ruby.h
408 #define ROBJECT_EMBED_LEN_MAX 3
409 struct RObject {
410     struct RBasic basic;
411     union {
412     struct {
413         long len;
414         VALUE *ptr;
415     } heap;
416     VALUE ary[ROBJECT_EMBED_LEN_MAX];
417     } as;
418 };

インスタンス変数に値を代入する関数では、今までは、objectの型がT_CLASS,T_OBJECT,T_MODULEを同じように処理をしていたようですが、1.9.0では、T_OBJECTを特別扱いするようになっているみたいです。

今までは、st_tableというハッシュテーブルに登録をしていたのですが、インスタンス変数の登録数がROBJECT_EMBED_LEN_MAXより小さければrobject->asに、そうでなければ、robject->heapに代入されるようになっています。

RHG自体、学生時代にちょっと読んで挫折していたんですが、今読んでみるとわかる部分もあり面白いですね。
この章で、面白かったのが、Rubyの文字列って保持する文字列より多くメモリとって変更の都度mallocとかしなくていいようになっているんですが、Arrayに関しては、配列の要素数が変わる度に、remallocやmemmoveが行われているんですね。