在Java中,在我们创建基元的方法中,它们存储在堆栈内存中,而实例化的对象(如使用new)则放在堆上.在scala中,AnyVal子类(类似Int)是无法实例化的不可变值实例.因此,如果我Int在Scala方法中创建它,它会转到堆还是堆栈.我问它,因为在Scala中Int是一个对象.
该Scala语言规范不说的内存是如何组织的任何东西.每个实现都可以随意组织其内存,但它需要.
顺便说一下,关于Java的陈述是错误的:
在Java中,在我们创建基元的方法中,它们存储在堆栈内存中,
Java语言规范中没有任何内容可以说明这一点.事实上,对于许多实现,情况并非如此.例如,Oracle JDK的实现将尝试将基元存储在寄存器中,或者完全忽略它们,而不是将它们存储在堆栈中.
实例化对象(如使用'new')放在堆上.
同样,Java语言规范中没有任何内容可以说明这一点.而且,例如在Oracle的实现中,这不一定是真的.Oracle的优化编译器将执行Escape Analysis并尽可能在堆栈上分配对象,即编译器可以证明引用不会超出范围.Azul的实现总是在堆栈上分配对象(除非它可以证明引用肯定会逃避本地范围),并执行转义检测,即当它检测到转义本地范围的引用时,它会将对象从堆栈移动到堆.
实际上,您可以在没有堆栈的情况下实现Java,并且完全符合Java语言规范.
在scala中,AnyVal的子类型(如Int)是无法实例化的不可变值实例.因此,如果我在Scala方法中创建一个Int,它会转到堆还是堆栈.
这取决于实现,版本,具体情况和许多其他事情.Scala语言规范不说的一种方式或其他,其实它并没有说任何有关如何存储,更不用说关于栈和堆.
我问它,因为在Scala Int中是一个对象.
但同样,这并没有说明它是如何实施的.例如,Scala-JVM实现scala.Int为JVM原语,然后简单地"伪造"方法.
| 归档时间: |
|
| 查看次数: |
88 次 |
| 最近记录: |