未使用的 return 值会怎样?

What happens to unused return values?

首先我确实调查了这个。我在这里发现了同样的问题,但关于 C++:What happens to unused function return values?

我的兴趣在于 Java(尽管该线程确实很有趣)。

普遍的共识是没有任何事情真正发生,如果以后有任何事情被覆盖。 java 与该线程有什么不同吗?

(链接将不胜感激,因为我可以想象可能会发生什么,但想要一些证据和细节。另外,我正在寻找比 "It doesn't get set to a variable" 更深入的内容)

编译器发现它没有被使用,只是将 (return) 堆栈上的值保留为未分配,也就是将其删除。如果您分配它但不使用它,它会一直存在到不再使用此引用为止。

见附件截图。 Eclipse 和一个字节码插件。

在L0下,可以看到存储了concat调用的return(ASTORE 1)。 L1 下的相同调用,在 Java 中未使用或分配,仅使用 POP 处理,也就是从堆栈中删除并消失。

希望对您有所帮助。

如果我们编译程序

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" -verbose Test.class

我们看到 main() 的以下内容:

  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 可以自由地重用内存位置(或 cpu 寄存器)来保存其他一些变量。