Как локальные переменные в методе подсчитываются байт-кодом Java

Недавно я узнал о байт-коде java, и я понял большую его часть, но я не понимаю, как, например, подсчитывается количество локальных переменных. Я думал, что это будет просто сумма локальных переменных, но этот код генерирует 1 локальную переменную при просмотре байт-кода.

public int testFail()
{
    return 1;
}

Но я думал, что это должны быть нулевые локальные переменные, потому что локальные переменные не определены.

Кроме того, этот метод также генерирует одну локальную переменную, но имеет больше локальных переменных, чем в предыдущем примере.

Наконец, этот метод

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

генерирует две локальные переменные в байт-коде.

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

person Popgalop    schedule 28.06.2013    source источник
comment
оба вышеуказанных метода одинаковы.   -  person    schedule 28.06.2013
comment
извините, я исправил, что я разместил оба метода   -  person Popgalop    schedule 28.06.2013
comment
Взгляните на эти ссылки arhipov.blogspot.com/2011/01/ java-bytecode-fundamentals.html и zeroturnaround.com/rebellabs/   -  person    schedule 28.06.2013


Ответы (2)


Нестатические методы используют слот локальной переменной для this. Еще одна сложность заключается в том, что longs и doubles считаются за 2 каждый. Кроме того, в зависимости от вашего компилятора и настроек вы можете не увидеть однозначное соответствие между локальными переменными в исходном коде и локальными переменными в байтовом коде. Например, если отладочная информация отсутствует, компилятор может удалить ненужные локальные переменные.

Редактировать:

Я только что вспомнил: компиляторы также могут повторно использовать слоты локальных переменных. Например, учитывая этот код:

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

один и тот же слот можно использовать для i и j, поскольку их области действия не пересекаются.

person Adam Crume    schedule 28.06.2013

Причина, по которой у первого есть локальная переменная, заключается в том, что это нестатический метод, поэтому есть неявный параметр this.

person Antimony    schedule 28.06.2013