まず第一に、私は「時期尚早の最適化」恐怖症の人たちに私を惜しまないように頼みます:私は何も最適化したくありません、私はただ興味があります。
私はstackoverflowを含む2つのことを読んだ/観察しました(現在リンクを見つけることができません):
- メソッド呼び出しの場合、すべてのローカル変数のメモリは、メソッドの「最初」に予約されます。つまり、下位レベルのスコープで宣言された変数のメモリも予約されます(これは科学的に不適切な表現であることがわかっています。たとえば、呼び出しメカニズムの動作を無視するなどです。 、しかし、ポイントが明確であることを願っています)。明らかに、実行中のプログラムのスコープは存在しません。スコープは、読みやすさ、保守性、コードの構造化、コンパイラーへの意図(最適化のヒントの提供など、以下を参照)を向上させるために、ソースコードレベルでのみ存在します。
- 可能な限り最小のスコープ(つまり、まだ必要な最高レベル)で変数を宣言することの利点の1つは、「コンパイラーが(他のブロックの)他の一時変数にメモリーを再利用できる」ことです。これは私には明確で論理的に聞こえます。
コンパイラ/JIT/何が実際に最適化できるのか、そして何ができないのか疑問に思っています。
次の方法があります(変数が実際に使用されていると仮定します。そのため、変数を最適化することはできません)。
// The method does many (useful) things, but these were cut here
public void myMethod() {
int var1 = 1;
... // do work
if (something) {
int var2 = 2;
int var3 = 3;
... // do work
}
int var4 = 4;
int var5 = 5;
... // do work
}
1.)コンパイラーは、およびのスペースを検出して、var2
およびのスペースをvar3
再利用できますか?分解されたバイトコードでそのようなことを見たのを覚えていません。var4
var5
2.)上記のコードメソッドは、メソッドの最後が{}に設定されている場合と同等ですか?
public void myMethod() {
int var1 = 1;
... // do work
if (something) {
int var2 = 2;
int var3 = 3;
... // do work
}
{
int var4 = 4;
int var5 = 5;
... // do work
}
}
最後に、より単純なケースを見てみましょう。
public void myMethod() {
int var1 = 1;
... // do work, and then don't refer to var1 any more
int var4 = 4;
int var5 = 5;
... // do work
}
3.)この場合、メモリは(または)var1
に再利用できますか?つまり、このような場合、メソッドには3つではなく2つのローカル変数用のメモリがあれば十分です。var4
var5
int
(理論的には、これらはコンパイラーにとって明らかなケースであることを私は知っていますが、コンパイラーが何もできない、または想定できない理由など、物事を見落とすことがあります。)