Array

struct RArray

Array の実体は struct RArray で、ruby.h で定義されている。

struct RArray {
    struct RBasic basic;
    long len, capa;
    VALUE *ptr;
};
ptr と len はそれぞれその名前どおりのものを格納する。Array は 頻繁に長さの変更が起こるので、常に余分にメモリ領域を確保して おくようになっている。その本当の長さを記録しているのが capa。

RString にも capa があれば連続した concat などの処理は速くなりそう だが、書いたとおり隙間がないので無理である。全部ポインタ四つ分に しようというのもアリだが、RObject でそうとう無駄が出ることを考慮 してからやるべきである。こういう点を考えるとオブジェクトのリストを 構造体別に分類したらどうかなーと思うのだが、それはそれで GC の時に やっかいになって結局スピードも落ちた、なんてことになりかねない 気がする。