Почему javac иногда создает ненужные копии переменных?

1

У меня код выглядит следующим образом:

boolean[] array = new boolean[200];
int[] indexes = {10, 42, 62, 74};
while(true) {
    //some code here
    StringBuilder sb = new StringBuilder();
    for (int j : indexes) {
        sb.append(array[j] ? '1' : '0');
    }
}

Байт-код для этого:

ASTORE 3 //"indexes" array
...
ALOAD 3
ASTORE 8
ALOAD 8
ARRAYLENGTH
...

Я не уверен, почему javac copy ref для массива в другой локальный var.

  • 0
    Какая часть этого байт-кода "скопировать ref в массив в другой локальный var" ?
  • 0
    @ Jean-FrançoisSavard ALOAD 3 а затем ASTORE 8 .
Теги:
bytecode
javac

1 ответ

6
Лучший ответ

Цикл for-each преобразуется в нечто вроде этого:

{
    int[] hidden_array_ref = indexes;
    int hidden_length = hidden_array_ref.length;
    for(int hidden_counter = 0; hidden_counter < hidden_length; hidden_counter++) {
        int j = hidden_array_ref[hidden_counter];
        sb.append(array[j] ? '1' : '0');
    }
}

В частности, обратите внимание на int[] hidden_array_ref = indexes; , Это копия, о которой вы спрашиваете.

Компилятор делает это так, чтобы, если вы пишете что-то вроде:

for(int j : indexes) {
    indexes = new int[0];
    sb.append(array[j] ? '1' : '0');
}

присвоение indexes не влияет на цикл.

  • 0
    Не уверен, как это отвечает "почему javac копирует ref в массив в другой локальный var"
  • 0
    @ Jean-FrançoisSavard это ссылка на indexes , которые копируются (в другую скрытую локальную переменную, которую я назвал hidden_array_ref )
Показать ещё 4 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню