またJavaネタ。

Javaでは値をそのまま複数返せないのは知ってますよねー。
今日はそれを何とかしようというネタ。

で、解決方法。


■その1.データが64bit以内に収まるなら、longにエンコードしちゃう。
いやまー、そのまんまですけどね。
例えば、intの値を2つ返そうとすると、

int value1, value2;
...
return (((long)value1) << 32) | ((long)value2 & 0xFFFFFFFFL);

いやー、まー、まんまですね。

■その2.データが64bit以内に収まらない場合、オブジェクトを作って返す。

return new Result(value1, value2, ...);

これの欠点は、関数を呼ぶ毎にオブジェクトを作っちゃうため、100万回とか呼ぶとメモリを食いまくってほぼ確実にGCのお世話になります。
重いんですねぇ・・・。

■その3.返り値を格納するためのバッファとしてオブジェクトを渡す。

public void function(ResultBuffer result, ...){
    ...
    result.setValue1(value1);
    result.setValue2(value2);
    ...
}

みたいな感じ。ようはCでバッファのポインタ渡すようなもんですね。これはループ回して何度もおんなじメソッド呼ぶような場合に効果てきめんですね。ところが、もちろんバッファは関数Stackには用意できないので、呼び出し元のメソッドでオブジェクトを生成しなければいけないわけです。CとかだとStack上にオブジェクト作れるんでもんだいなかったりするんですけどね〜。呼び出しもとのメソッドが何度も呼ばれればやっぱりGCのお世話になるわけです。


というわけで、続く。
次回はローカルなバッファを作るお話。


うーん・・・。Javaばっかだなぁ。まぁ、いっか。