メソッド/フィールドの可視性は、Java でのメソッドのインライン化にどのように影響しますか?
私が念頭に置いているケースは、フィールドのpublic
ゲッターのようなものです:private
private Thing blah;
public Thing getBlah() {
return blah;
}
ここでいくつかの問題が発生します。
1 つは、Java コンパイラ自体がインライン展開を行うかどうかです。この質問には、イエスと言う人もいればノーと言う人もいて、さまざまな答えがあるようです。以前はインライン化を行わなかったが、現在はインライン化を行っているためなのか、それとも正しい人もいれば間違っている人もいるというだけなのかはわかりません...
getBlah()
さて、インライン化を行う場合、呼び出しをインライン化できない可能性があると考えるのは正しいでしょうか? メソッドは非常に単純であり、メソッドを呼び出すオーバーヘッドはメソッド自体のコードと同じくらい大きいため、これらはインライン化が有用な場所であることは明らかです。private
しかし、コンパイラによってインライン化された場合、フィールドに直接アクセスするバイトコードになってしまいます。そして確かにJVMは文句を言うでしょうか?(これは、このメソッドが であっても適用されstatic final
ます。)
第二に、JIT コンパイラーはどうですか? 私が見る限り、そのレベルでのインライン化に関しては、この問題は当てはまりません。ネイティブ コードが生成されると、JVM はすでにチェックを行っており、メソッドを呼び出すことができることを確認しています (これは であるためpublic
)。そのため、可視性の問題なしに、呼び出しをインライン化するネイティブ コードを生成できます...はい?