与test中对c的显式赋值相比,test2中add(a,b)的返回值会发生什么?
void test(int a,int b) {
int c=add(a,b);
return incr(c);
}
void test2(int a,int b) {
return incr(add(a,b));
}
可能在字节码的实现中通过引用/值分配,即对于JVM,AVM2和Javascript解释器/ JIT在理论上是相同的。
可能两个命名值(变量)和没有命名值都是对堆栈中上下文位置的隔离指令。也就是说,将返回值转换为下一条指令没有神奇的优化。
即incr
中的test2
指令仍会导致incr 3rd value of the stack
或类似内容。
答案 0 :(得分:1)
答案是“它取决于”。在您正在使用的编译器上,以及您在编译器中使用的选项(编译以获得最佳可调试性与最佳性能)。
优化模式中的一个体面的现代编译器将意识到变量c
仅在return
语句中立即使用一次,并且只将值保留在堆栈的顶部,以便它可以是return
编辑。
在调试模式下,通常会关闭该优化,并将值分配给名为c
的实数变量,占用堆栈帧中的一个插槽。这使您可以在该行之后暂停并在返回执行之前检查该值,以查看分配给它的内容。它需要多花费几个周期,但由于这不是您通常用于运送到“客户”的代码或性能分析的模式,除了编译器/调试器作者之外通常对任何人都无关紧要。