2015-03-15 3 views
4

Сначала я изучил это. Я нашел тот же вопрос здесь, но в отношении C++: What happens to unused function return values?Что происходит с неиспользуемыми возвращаемыми значениями?

Мой интерес к Java (хотя поток действительно интересен).

Генеральный консенсус состоял в том, что ничего действительно не происходит, и если что-то позже будет отменено. Существуют ли какие-либо отличия от этой темы для java?

(ссылки будут оценены, как я могу себе представить, что, вероятно, произойдет, но хотел бы некоторые доказательства & детали. Кроме того, я ищу немного более подробно, то «Это не делает приготовьтесь к переменной»)

+0

Какой ответ вы ищете? Что-то с точки зрения компилятора? Потому что с точки зрения программиста «Не получается установить переменную», кажется, лучший ответ. – hsgubert

+0

Можете ли вы задать более конкретный вопрос, чем «что происходит»? Это вопрос о Java, байт-коде Java или фактическом машинный код, скомпилированный компилятором вовремя? – meriton

+0

Что делает компилятор/JVM в этой ситуации. – ThatOneGuy

ответ

9

Компилятор видит, что он не используется и просто оставляет значение в стеке (возврате), которое не присвоено, а также удаляет его. Если вы назначаете его, но не используете его, он живет до тех пор, пока эти ссылки больше не будут использоваться.

См. Прилагаемый скриншот. Eclipse и байт-код.

Под L0 вы можете видеть, что возврат concat-вызова сохраняется (ASTORE 1). Тот же вызов под L1, который в Java не используется или не назначен, обрабатывается только POP, иначе он удаляется из стека и уходит.

bytecode of return handling

Надежда, что помогает.

+0

О, хорошо, спасибо. Также, как называется этот плагин, если вы не возражаете против моего запроса? Я искал Eclipse Marketplace со строкой «bytecode» и не дал никаких результатов :( – ThatOneGuy

+1

Bytecode Outline by Andrej Loskutov: http://andrei.gmxhome.de/eclipse.html – ReneS

3

Если мы скомпилировать программу

public class Test { 
    static int m() { 
     return 42; 
    } 

    public static void main(String[] args) { 
     m(); 
    } 
} 

, а затем проверить сгенерированный байткод с

"C: \ Program Files \ Java \ jdk1.8.0_05 \ Bin \ javap.exe" - многословный Test.class

мы видим следующее для основных():

public static void main(java.lang.String[]); 
    descriptor: ([Ljava/lang/String;)V 
    flags: ACC_PUBLIC, ACC_STATIC 
    Code: 
     stack=1, locals=1, args_size=1 
     0: invokestatic #18     // Method m:()I 
     3: pop 
     4: return 
     LineNumberTable: 
     line 10: 0 
     line 11: 4 
     LocalVariableTable: 
     Start Length Slot Name Signature 
      0  5  0 args [Ljava/lang/String; 

Как мы видим, компилятор испускает команду pop, которая дает указание JVM отказаться от этого значения.

В машинный код это означает, что JVM может повторно использовать ячейку памяти (или регистр процессора) для хранения какой-либо другой переменной.