javaのinline

ケント・べックさんの『実装パターン』を読んでいたら、javaのinline化を〜と記述がありました。はて、javaにinline修飾子はなかったと思うのだが・・・と気になりネットで調べてみたら下記のことが分かったのでメモ。

●そもそもinline化って何すんの?
通常プログラム実行時、関数を呼び出す際は、戻り位置をスタックに積んでヒープ領域に確保している関数のアドレスに飛ぶ。一方inline化時は、飛ばずにそのまま関数の内容を展開され、実行する。
※その分関数を呼び出したオブジェクトのサイズは大きくなるから、メモリの小さいマシンで実行時は、余計なページングを引き起こしキャッシュのヒット率を減らすかもしれない。逆に関数自体が小さい時はinline化した方がオブジェクトコードが小さくなり最適かもしれない。

javaのinline化
C++ではinline修飾子があるので明示的に分かりますが、javaにはありません。JVMが特定の条件で勝手にやってくれるようです。その条件は以下。

(1)privateメソッド
⇒保持しているクラス内からしか参照されないため。
(2)staticメソッド
インスタンスに依存しないため他への参照を気にしない。
(3)final修飾子付きメソッド
⇒オーバライドする、される恐れがないため。

●つまり
ケント・べックさんが言いたいのは、無駄なインタフェース(publicメソッド)はやめようということみたいです。

●ちなみに
C++でも、inlineを付けなくても、宣言時に、定義を実装することで、inline化を非明示的にコンパイラに要請することになるらしい。
さらに、テンプレート関数は通常ヘッダファイルに内で定義するべき(他のソースファイルからは参照できなくなるため)ですが、テンプレートの具体化とinline化は別作業になるらしい。