赋值变量vs立即使用返回值

时间:2014-01-22 22:07:35

标签: c assembly

与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或类似内容。

1 个答案:

答案 0 :(得分:1)

答案是“它取决于”。在您正在使用的编译器上,以及您在编译器中使用的选项(编译以获得最佳可调试性与最佳性能)。

优化模式中的一个体面的现代编译器将意识到变量c仅在return语句中立即使用一次,并且只将值保留在堆栈的顶部,以便它可以是return编辑。

在调试模式下,通常会关闭该优化,并将值分配给名为c的实数变量,占用堆栈帧中的一个插槽。这使您可以在该行之后暂停并在返回执行之前检查该值,以查看分配给它的内容。它需要多花费几个周期,但由于这不是您通常用于运送到“客户”的代码或性能分析的模式,除了编译器/调试器作者之外通常对任何人都无关紧要。