Shammer's Philosophy

My private adversaria

引数を変数に代入する理由

Cの場合はほぼ確実に、Javaでも以下のようなコードを見かけることがある。

void foo(int x, int y) {
  int a = x;
  int b = y;
  ...
}

コードだけの話だと、この関数内ではそのまま x や y といった変数名で目的の値を参照できるのに、あえてローカル変数に入れる、ということをしている。これはなぜか。

アセンブリレベルというか、CPUレベルの動作を考えると、関数の引数は通常はヒープにあることが多い。コードの中で x や y という形で参照していると、CPU の動きは毎回ヒープへアクセスすることになる。スタックへのアクセスとヒープへのアクセスだと、ヒープへのアクセスの方が負荷が高い(らしい)ため、このオーバーヘッドを減らすために意図的にローカル変数に引数の値を代入するとよい、ということのようだ。

Cだとこの動きは理解できるが、Java だとどうなのか。Java も同じなのか、あるいはCでもそうだから、という理由で真似しているだけなのか・・・でも、

 http://www.amazon.co.jp/Javaの鉄則―エキスパートのプログラミングテクニック-ピーター-ハガー/dp/489471258X

でこの内容言及されていたような記憶もある。いずれにせよ、引数に何度もアクセスするようなコードは書くなってことだな。