存储在Scala中的AnyVal子类型在哪里?

时间:2018-03-24 07:49:01

标签: scala

在Java中,在我们创建基元的方法中,它们存储在堆栈内存中,而实例化的对象(如使用new)则放在堆上。在scala中,AnyVal的子类型(如Int)是无法实例化的不可变值实例。因此,如果我在Scala方法中创建Int,它会转到堆还是堆栈。我问它是因为在Scala中Int是一个对象。

1 个答案:

答案 0 :(得分:8)

Scala Language Specification没有说明内存的组织方式。每个实现都可以随意组织它的内存。

顺便说一句,关于Java的陈述是错误的:

  

在Java中,在我们创建基元的方法中,它们存储在堆栈存储器中,

Java Language Specification中没有任何内容可以说明这一点。事实上,对于许多实现,这不是真的。例如,Oracle JDK的实现将尝试将基元存储在寄存器中,或者完全忽略它们,而不是将它们存储在堆栈中。

  

实例化对象(如使用' new')放在堆上。

同样,Java语言规范中没有任何内容可以说明这一点。而且,例如在Oracle的实现中,这不一定是真的。 Oracle的优化编译器将执行Escape Analysis并尽可能在堆栈上分配对象,即编译器可以证明引用不会逃避范围。 Azul's implementation总是在堆栈上分配对象(除非它可以证明引用肯定会逃避本地范围),并执行转义检测,即当它检测到转义本地范围的引用时,它将移动对象堆栈到堆。

实际上,您可以在没有堆栈的情况下实现Java,并且完全符合Java语言规范。

  

在scala中,AnyVal的子类型(如Int)是无法实例化的不可变值实例。因此,如果我在Scala方法中创建一个Int,它会转到堆还是堆栈。

这取决于实现,版本,具体情况和许多其他事情。 Scala语言规范并没有说出这样或那样的方式,事实上,它并没有说关于如何记忆的任何,更不用说堆栈和堆了。

  

我问它,因为在Scala Int中是一个对象。

但同样,这并没有说明它是如何实施的。例如,Scala-JVM将scala.Int实现为JVM原语,然后简单地假设" fakes"方法。