2013-06-28 55 views
0

我最近一直在學習java字節碼,並且我已經瞭解了它的大部分內容,但我對如何計算本地變量計數感到困惑。我認爲這將只是總的局部變量,但翻翻字節碼如何計算方法中的局部變量java字節碼

public int testFail() 
{ 
    return 1; 
} 

當這個代碼生成1個局部變量,但我認爲它應該是,因爲沒有局部變量定義零個局部變量。

此外,此方法還會生成一個局部變量,但它具有比上一個示例更多的局部變量。

最後這種方法

public static int testFail(int a, int b) 
{ 
    return a+b; 
} 

gnerates在字節碼中兩個本地變量。

public static int testFail(int a) 
{ 
    return a; 
} 
+2

以上兩種方法都是一樣的。 –

+0

對不起,我修正了我發佈了兩種方法 – Popgalop

+1

看看這些鏈接http://arhipov.blogspot.com/2011/01/java-bytecode-fundamentals.html和http://zeroturnaround.com/rebellabs/java-字節碼基本面使用對象 - 和調用的方法/#!/ –

回答

1

非靜態方法使用局部可變槽this。另一個複雜因素是longs和double各自計爲2。另外,根據您的編譯器和設置,您可能看不到源代碼中的局部變量與字節代碼中的局部變量之間的一對一映射。例如,如果省略調試信息,編譯器可能會消除不必要的局部變量。

編輯:

我只記得:編譯器也可以重複使用局部變量插槽。例如,給定的代碼:

public static void test() { 
    for(int i = 0; i < 100; i++) { 
     ... 
    } 
    for(int j = 0; j < 100; j++) { 
    } 
} 

相同的時隙可用於ij,因爲它們的範圍不重疊。

0

的第一個具有一個局部變量的原因是因爲它是一種非靜態方法,所以有一個隱含的this參數。

相關問題