未使用的 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 寄存器)来保存其他一些变量。
首先我确实调查了这个。我在这里发现了同样的问题,但关于 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 寄存器)来保存其他一些变量。