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