5

我只是对模式匹配及其相应的字节码进行了一些调查。

val a = Array(1,2,3,4)
a.map {
  case i => i + 1
}

对于上面的代码,我使用 javap 并获得了 map 中匿名函数的字节码:

public int apply$mcII$sp(int);
Code:
   0: iload_1       
   1: istore_2      
   2: iload_2       
   3: iconst_1      
   4: iadd          
   5: ireturn       

所以在我看来,在第 0 行我们推送一个 int(参数),然后在第 1 行我们加载 int,在第 2 行我们将它推回......这里的目的是什么?

谢谢!

4

2 回答 2

2

哥们-optimise试试

  public int apply$mcII$sp(int);
    flags: ACC_PUBLIC
    Code:
      stack=2, locals=2, args_size=2
         0: iload_1       
         1: iconst_1      
         2: iadd          
         3: ireturn 

采用

scala> :javap -prv -

然后像

scala> :javap -prv $line4/$read$$iw$$iw$$anonfun$1
于 2013-10-15T14:32:40.627 回答
1

这不是一个真正的答案,因为我无法弄清楚为什么会发生这种情况。我希望这些观察结果至少会有所帮助:)


我在 Scala 2.10 中看到以下字节码:

public int apply$mcII$sp(int);
    Code:
       0: iload_1       ; var1 -> stack
       1: istore_2      ; var2 <- stack
       2: iload_2       ; var2 -> stack
       3: iconst_1      ; 1 -> stack
       4: iadd      
       5: istore_3      ; var3 <- stack
       6: iload_3       ; var3 -> stack
       7: ireturn       ; return <- stack

前两条指令似乎只是将 var1 的值移动到 var2,然后将 var2 作为参数移动到堆栈。在 之后可以观察到相同的情况,结果没有明显原因iadd存储在其中,因为无论如何都会从堆栈中返回值。var3ireturn

于 2013-10-10T14:12:22.033 回答