Почему компилятор Eclipse Java проверяет приведение типов с нуля?JAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Почему компилятор Eclipse Java проверяет приведение типов с нуля?

Сообщение Anonymous »

Рассмотрим следующий фрагмент Java:

Код: Выделить всё

public class Test {
public static void use(Object[] x) {
}

public static void main(String[] args) {
Object[] x = null;

use(x);
}
}
Байт-код Java, созданный для main() компилятором Eclipse 3.7, выглядит следующим образом:

Код: Выделить всё

public static void main(java.lang.String[]);
Code:
0:   aconst_null
1:   checkcast   #20; //class "[Ljava/lang/Object;"
4:   astore_1
5:   aload_1
6:   invokestatic    #21; //Method use:([Ljava/lang/Object;)V
9:   return
Напротив, это байт-код, созданный компилятором OpenJDK 1.6.0b22:

Код: Выделить всё

public static void main(java.lang.String[]);
Code:
0:   aconst_null
1:   astore_1
2:   aload_1
3:   invokestatic    #2; //Method use:([Ljava/lang/Object;)V
6:   return
Обратите внимание, что компилятор Eclipse выдает дополнительный код операции проверки. Похоже, что это делается только для массивов, а не для любого другого типа переменных.

Мои вопросы:
  • Насколько мне известно, значение null можно назначить любому классу, включая массивы. Имеет ли вообще какой-либо смысл проверять известное нулевое значение?
  • Есть ли лишнее checkcast влияет на производительность?
  • Можно ли считать это ошибкой в ​​компиляторе Eclipse Java?
ПРИМЕЧАНИЕ:

Я могу частично ответить на (2), по крайней мере, так что касается JVM OpenJDK 1.6.0b22. Я выполнил простой тест с несколькими присвоениями значения null в ограниченном по времени цикле. Я не смог обнаружить какой-либо постоянной разницы в производительности, так или иначе.

Тем не менее, мой тест был достаточно простым, и любой полуприличный оптимизатор, вероятно, сделал бы его бесполезным. , поэтому это может не указывать на реальное применение. Я ожидал, что JVM всегда оптимизирует этот код операции checkcast, но это может быть не так.

Подробнее здесь: https://stackoverflow.com/questions/758 ... -from-null
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»