Array の実体は struct RArray で、ruby.h で定義されている。
struct RArray { struct RBasic basic; long len, capa; VALUE *ptr; };ptr と len はそれぞれその名前どおりのものを格納する。Array は 頻繁に長さの変更が起こるので、常に余分にメモリ領域を確保して おくようになっている。その本当の長さを記録しているのが capa。
RString にも capa があれば連続した concat などの処理は速くなりそう だが、書いたとおり隙間がないので無理である。全部ポインタ四つ分に しようというのもアリだが、RObject でそうとう無駄が出ることを考慮 してからやるべきである。こういう点を考えるとオブジェクトのリストを 構造体別に分類したらどうかなーと思うのだが、それはそれで GC の時に やっかいになって結局スピードも落ちた、なんてことになりかねない 気がする。