gpt4 book ai didi

scala - 实现固定大小、不可变且专用的向量

转载 作者:行者123 更新时间:2023-12-04 01:06:11 25 4
gpt4 key购买 nike

为了性能和安全,我想实现一个固定大小的向量,它既不可变又专门(我需要快速算术)。我的第一个想法是使用 @specialized注释(因为我需要整数和实数)。

这是第一次尝试:

package so
class Vec[@specialized A] private[so] ( ary: Array[A] ) {
def apply( i: Int ) = ary(i)
}

但是,当我使用 javap 分析生成的字节码时,我可以看到元素仍然是装箱的。例如:
public double apply$mcD$sp(int);
Code:
0: aload_0
1: iload_1
2: invokevirtual #33; //Method apply:(I)Ljava/lang/Object;
5: invokestatic #83; //Method scala/runtime/BoxesRunTime.unboxToDouble:(Ljava/lang/Object;)D
8: dreturn

看起来数组不是专门的,这看起来很愚蠢,因为数组在 JVM 上是专门的。

我还能做些什么来达到我的目标吗?

最佳答案

您可能正在查看编译为 Vec.class 的代码。根据 this thread特化发生在子类中。这可以在 REPL 中验证:

scala> class Vec[@specialized A] ( ary: Array[A] ) {
| def apply( i: Int ) = ary(i)
| }
defined class Vec

scala> new Vec( Array[Int](1) ).getClass
res0: java.lang.Class[_ <: Vec[Int]] = class Vec$mcI$sp

如您所见 Int它正在使用子类 Vec$mcI$sp .如果您在该类上运行 javap,您将看到它实际上正确地专门化了代码。这就是 Vec$mcI$sp.class 中的 apply 方法的样子使用 javap:
  public int apply(int);
flags: ACC_PUBLIC
Code:
stack=2, locals=2, args_size=2
0: aload_0
1: iload_1
2: invokevirtual #13 // Method apply$mcI$sp:(I)I
5: ireturn

我想这就是您在使用 Int 时想要的.

关于scala - 实现固定大小、不可变且专用的向量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10257759/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com