我只是对模式匹配及其相应的字节代码进行了一些调查。
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行我们将它推回去......这里的目的是什么?< / p>
谢谢!
答案 0 :(得分: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
答案 1 :(得分: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
之后可以观察到相同的结果,其中结果存储在var3
中没有明显的原因,因为ireturn
无论如何都会从堆栈中返回值。